使用着色器的OpenTK.dll中的SystemAccessViolationException [英] SystemAccessViolationException in OpenTK.dll using Shaders

查看:137
本文介绍了使用着色器的OpenTK.dll中的SystemAccessViolationException的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用OpenTK尝试在C#中创建着色器,反复出现内存访问冲突错误.任何帮助,将不胜感激.这是我遇到错误的类,可以在 https:中找到完整的代码: //github.com/Autodesk/synthesis/engine-research/OpenTKBuild

Using OpenTK to attempt to create shaders in C#, repeatedly getting memory access violation errors. Any help would be appreciated. Here is the class I am having errors with, full code will be able to be found at https://github.com/Autodesk/synthesis/engine-research/OpenTKBuild

第53行出现错误:

类型为'System.AccessViolationException'的未处理异常 发生在OpenTK.dll

An unhandled exception of type 'System.AccessViolationException' occurred in OpenTK.dll

其他信息:尝试读取或写入受保护的内存. 这通常表明其他内存已损坏.

Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

源代码:

using OpenTK.Graphics.OpenGL;

namespace OpenTKbuild
{
    class Shader
    {

    public int Program;

    public Shader(string vertexPath, string fragmentPath)
    {
        string vertexCode, fragmentCode;
        int vertex, fragment;

        try
        {
            System.IO.FileStream vShaderFile = new System.IO.FileStream(vertexPath, System.IO.FileMode.Open);
            System.IO.FileStream fShaderFile = new System.IO.FileStream(fragmentPath, System.IO.FileMode.Open);

            System.IO.StreamReader vShaderRead = new System.IO.StreamReader(vShaderFile);
            System.IO.StreamReader fShaderRead = new System.IO.StreamReader(fShaderFile);
            vShaderFile.Close();
            fShaderFile.Close();

            vertexCode = vShaderRead.ToString();
            fragmentCode = fShaderRead.ToString();

            char[] vShaderCodeChar = vertexCode.ToCharArray();
            char[] fShaderCodeChar = fragmentCode.ToCharArray();

            string[] vShaderCode = new string[vShaderCodeChar.Length];
            string[] fShaderCode = new string[fShaderCodeChar.Length];

            for (int i = 0; i < vShaderCodeChar.Length; i++)
            {
                vShaderCode[i] = vShaderCodeChar[i].ToString();
            }

            for (int i = 0; i < vShaderCodeChar.Length; i++)
            {
                vShaderCode[i] = vShaderCodeChar[i].ToString();
            }

            int vcount = vShaderCode.Length;
            int fcount = fShaderCode.Length;

            vertex = GL.CreateShader(ShaderType.VertexShader);
            GL.ShaderSource(vertex, 1, vShaderCode, ref vcount);
            GL.CompileShader(vertex);

            fragment = GL.CreateShader(ShaderType.FragmentShader);
//  -------->   error occurs onthe next line. when commented out, error does not persist.
            GL.ShaderSource(fragment, 1, fShaderCode, ref fcount);
            GL.CompileShader(fragment);

            Program = GL.CreateProgram();
            GL.AttachShader(Program, vertex);
            GL.AttachShader(Program, fragment);
            GL.LinkProgram(Program);

            GL.DeleteShader(vertex);
            GL.DeleteShader(fragment);
        }
        catch
        {
            throw new System.Exception("wut");
        }
    }

    public void Use()
    {
        GL.UseProgram(Program);
    }

}
}

推荐答案

使用以下代码解决:

using OpenTK;
using OpenTK.Graphics.OpenGL;

namespace MeshImport
{
class Shader
{

    public int ShaderProgram = 0;
    public static int vertex, fragment, geometry;

    public Shader() : base()
    {
    }

    public Shader(string vertexPath, string fragmentPath, string geometryPath)
    {
        #region OLD
        //string vertexCode = null, fragmentCode = null;

        //System.IO.FileStream vShaderFile = new System.IO.FileStream(vertexPath, System.IO.FileMode.Open);
        //System.IO.FileStream fShaderFile = new System.IO.FileStream(fragmentPath, System.IO.FileMode.Open);
        #endregion

        string vCode = null, fCode = null, gCode = null;

        try
        {
            #region OLD
            //System.IO.StreamReader vShaderRead = new System.IO.StreamReader(vShaderFile);
            //System.IO.StreamReader fShaderRead = new System.IO.StreamReader(fShaderFile);
            //vShaderFile.Close();
            //fShaderFile.Close();

            //vertexCode = vShaderRead.ToString();
            //fragmentCode = fShaderRead.ToString();
            #endregion
            vCode = System.IO.File.ReadAllText(vertexPath);
            fCode = System.IO.File.ReadAllText(fragmentPath);
            gCode = System.IO.File.ReadAllText(geometryPath);

        }
        catch
        { 
            System.Console.WriteLine("FILE NOT READ SUCCESSFULLY\n");
        }

        #region OLD
        //char[] vShaderCodeChar = vertexCode.ToCharArray();
        //char[] fShaderCodeChar = fragmentCode.ToCharArray();

        //string[] vShaderCode = new string[vShaderCodeChar.Length];
        //string[] fShaderCode = new string[fShaderCodeChar.Length];

        //for (int i = 0; i < vShaderCodeChar.Length; i++)
        //{
        //    vShaderCode[i] = vShaderCodeChar[i].ToString();
        //}

        //for (int i = 0; i < vShaderCodeChar.Length; i++)
        //{
        //    vShaderCode[i] = vShaderCodeChar[i].ToString();
        //}
        #endregion



        vertex = GL.CreateShader(ShaderType.VertexShader);
        GL.CompileShader(vertex);

        fragment = GL.CreateShader(ShaderType.FragmentShader);
        GL.CompileShader(fragment);

        geometry = GL.CreateShader(ShaderType.GeometryShaderExt);
        GL.CompileShader(geometry);

        compileShader(vertex, vCode);
        compileShader(fragment, fCode);
        compileShader(geometry, gCode);

        ShaderProgram = GL.CreateProgram();
        GL.AttachShader(ShaderProgram, vertex);
        GL.AttachShader(ShaderProgram, fragment);
        GL.LinkProgram(ShaderProgram);

        string info;
        GL.GetProgramInfoLog(ShaderProgram, out info);
        System.Console.WriteLine(info);

        GL.ProgramParameter(ShaderProgram, Version32.GeometryInputType, (int)All.Lines);
        GL.ProgramParameter(ShaderProgram, Version32.GeometryOutputType, (int)All.LineStrip);

        int tmp;
        GL.GetInteger((GetPName)ExtGeometryShader4.MaxGeometryOutputVerticesExt, out tmp);


        #region OLD

        //int success;
        //char[] infolog = new char[512];

        //int[] vcount = null;
        //int[] fcount = null;
        //int nullint = 0;

        //System.Text.StringBuilder sb = new System.Text.StringBuilder();
        //sb.Append(infolog);

        //vertex = GL.CreateShader(ShaderType.VertexShader);
        //GL.CompileShader(vertex);

        //GL.GetShader(vertex, ShaderParameter.CompileStatus, out success);
        //if (success == 0)
        //{
        //    GL.GetShaderInfoLog(vertex, 512, out nullint, sb);
        //    System.Console.WriteLine("Error: Shader : Vertex : Compilation Failed\n" + infolog);
        //}

        //fragment = GL.CreateShader(ShaderType.FragmentShader);
        //GL.CompileShader(fragment);

        //GL.GetShader(fragment, ShaderParameter.CompileStatus, out success);
        //if (success == 0)
        //{
        //    GL.GetShaderInfoLog(fragment, 512, out nullint, sb);
        //    System.Console.WriteLine("Error: Shader : Fragment : Compilation Failed\n" + infolog);
        //}

        //Program = GL.CreateProgram();
        //GL.AttachShader(Program, vertex);
        //GL.AttachShader(Program, fragment);
        //GL.LinkProgram(Program);

        //GL.DeleteShader(vertex);
        //GL.DeleteShader(fragment);

        #endregion


    }

    public void Use()
    {
        GL.UseProgram(ShaderProgram);
    }

    private void compileShader(int shader, string source)
    {
        GL.ShaderSource(shader, source);
        GL.CompileShader(shader);

        string info;
        GL.GetShaderInfoLog(shader, out info);
        System.Console.WriteLine(info);

        int compileResult;
        GL.GetShader(shader, ShaderParameter.CompileStatus, out compileResult);
        if (compileResult != 1)
        {
            System.Console.WriteLine("CompileError : " + source);
        }
    }

    public void cleanUp()
    {
        if (fragment != 0)
            GL.DeleteShader(fragment);
        if (vertex != 0)
            GL.DeleteShader(vertex);
        if (geometry != 0)
            GL.DeleteShader(geometry);
    }

}
}

这篇关于使用着色器的OpenTK.dll中的SystemAccessViolationException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆