Не компилятся шейдеры. Краш при попытке просмотра лога

200
17 июня 2018, 12:20

Я подгрузил в свою программу 2 шейдера:

Вертексный

#version 120
varying vec2 texcoord;
varying vec4 color;
void main() {
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
    texcoord = vec2(gl_MultiTexCoord0);
    color = gl_Color;
}

Фрагментный

#version 120
varying vec2 texcoord;
varying vec4 color;
uniform sampler2D texture;
uniform float procent;
void main() {
    vec4 original = texture2D(texture, texcoord);
    float d = (original.r + original.b + original.g)/3.0;
    if (procent < texcoord.y)
        gl_FragColor = vec4(d, d, d, color.a);
    else
        gl_FragColor = original * color;
}

При их компиле выдает 0. При попытке получить ошибку, приложение крашится, и среда даже не показывает исключение. Вот класс шейдера

class ShaderProgram {
    private int programID;
    public ShaderProgram() {
        programID = glCreateProgramObjectARB();
    }
    public ShaderProgram addFragment(byte[] data) {
        return add(data, GL_FRAGMENT_SHADER_ARB);
    }
    public ShaderProgram addVertex(byte[] data) {
        return add(data, GL_VERTEX_SHADER_ARB);
    }
    public ShaderProgram add(byte[] data, int shaderType) {
        int shaderID = glCreateShaderObjectARB(shaderType);
        string[] file = Encoding.UTF8.GetString(data).Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
        glShaderSourceARB(shaderID, 1, file, null);
        glCompileShaderARB(shaderID);
        int param;
        glGetObjectParameterivARB(shaderID, GL_OBJECT_COMPILE_STATUS_ARB, out param);
        if (param == GL_FALSE) { 
            StringBuilder builder = new StringBuilder();
            int hz;
            glGetInfoLogARB(shaderID, 99999, out hz, builder);
            throw new Exception("Shader compilation error!\n" + builder.ToString());
        }
        glAttachObjectARB(programID, shaderID);
        return this;
    }
    public ShaderProgram compile() {
        glLinkProgramARB(programID);
        int link_ok;
        glGetProgramiv(programID, GL_LINK_STATUS, out link_ok);
        if (link_ok == 0) {
            int maxLength;
            int length;
            glGetProgramiv(programID, GL_INFO_LOG_LENGTH, out maxLength);
            StringBuilder builder = new StringBuilder();
            glGetProgramInfoLog(programID, maxLength, out length, builder);
            throw new Exception(builder.ToString());
        }
        return this;
    }
    public void start() {
        glUseProgramObjectARB(programID);
    }
    public void stop() {
        glUseProgramObjectARB(0);
    }
    public int getUniform(String name) {
        return glGetUniformLocationARB(programID, name);
    }
}

Вот как я создаю свой шейдер

        public static ShaderProgram whiteColored;
        public static void RegisterShaders() {
            whiteColored = new ShaderProgram()
                .addVertex(Properties.Resources.texture_color)
                .addFragment(Properties.Resources.white_colored)
                .compile();
        }

При вызове glGetInfoLogARB приложение крашится, поэтому не могу понять в чем проблема. Сам файл шейдеров читается нормально. Если оставить во фрагментном шейдере только установку цвета - gl_FragColor = vec4(1.0,0.0,0.0,1.0);, то он будет работать

Answer 1

Что бы решить проблему, надо в glShaderSourceARB в качестве параметра надо передавать не массив из строчек, а одну единую строчку с разделителем \r\n (он установится автоматически, если вы будете считывать строчки с файла). Так же надо указать длину строки. Вот как я начал вызывать glShaderSourceARB:

string file = Encoding.UTF8.GetString(data);
int lenght = Encoding.UTF8.GetString(data).Length;
glShaderSourceARB(shaderID, 1, new string[] { file }, ref lenght);
READ ALSO
Разные DataGridView, одинаковые имена колонок

Разные DataGridView, одинаковые имена колонок

Есть 2 разных dataGridView, можно ли что бы они содержали одинаковые имена колонок?

191
Visual Studio 2015 ошибка при остановке отладчика

Visual Studio 2015 ошибка при остановке отладчика

Описание проблемы: подключаюсь через RDP к удаленному серверу, на этом сервере запускаю студию Visula Studio 2015, запускаю отладчик и при каждой остановки...

211
Какие есть генераторы документации для SignalR core?

Какие есть генераторы документации для SignalR core?

Нужен генератор документации в проекте AspNet

160
подставить пароль в строку подключения

подставить пароль в строку подключения

Есть приложение WinForms + entity-framework + MS SQLЕсли задать всю строку подключения в app

226