GLSL Shader отображает только черный экран LWJGL

Я новичок в шейдерах, у меня есть код GLSL для правильной компиляции (ну, без ошибок компилятора), и по какой-то причине я продолжаю получать черный экран. Я использую LWJGL. У меня постоянно появляется черный экран, когда я пытаюсь визуализировать треугольник, даже если он должен быть белым в соответствии с цветом, который я передал во фрагментный шейдер. Я опубликовал фрагменты кода ниже, надеюсь, их достаточно, чтобы понять, в чем проблема.

Исходный код фрагментного шейдера

void main()
{
    gl_FragColor = vec4(1.0f, 1.0f, 1.0f, 1.0f);
{

Исходный код вершинного шейдера

void main()
{
    gl_Position = ftransform();
}

Код считывателя шейдеров

        vertShaderString = shaderName + ".vert";
        fragShaderString = shaderName + ".frag";
        shader = GL20.glCreateProgram();
        vertShader = GL20.glCreateShader(GL20.GL_VERTEX_SHADER);

        try{
            String temp;
            BufferedReader reader = new BufferedReader(new FileReader(new File(vertShaderString)));
            while ((temp = reader.readLine()) != null){
                vertSource.append(temp).append("\n");
            }
            reader.close();


            BufferedReader fragReader = new BufferedReader(new FileReader(new File(fragShaderString)));
            String otherTemp;
            while ((otherTemp = fragReader.readLine()) != null){
                fragSource.append(otherTemp).append("\n");
            }
            fragReader.close();
        }catch (Exception e){
            e.printStackTrace();
        }

Код настройки шейдера

        GL20.glShaderSource(vertShader, vertSource);
        GL20.glCompileShader(vertShader);

        if (GL20.glGetShaderi(vertShader, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE){
            System.err.println("Failed to compile vertex shader");
        }


        GL20.glShaderSource(fragShader, fragSource);
        GL20.glCompileShader(fragShader);

        if (GL20.glGetShaderi(fragShader, GL20.GL_COMPILE_STATUS) == GL11.GL_FALSE){
            System.err.println("Failed to compile fragment shader");
        }

        GL20.glAttachShader(shader, vertShader);
        GL20.glAttachShader(shader, fragShader);
        GL20.glLinkProgram(shader);
        GL20.glValidateProgram(shader);

Включение и отключение кода шейдера

public void begin(){
    GL20.glUseProgram(shader);
}

public void end(){
    GL20.glUseProgram(0);
}

Метод рендеринга

public void render(){
        GL11.glClearColor(0, 0, 0, 1);
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
        GL11.glColor4f(1, 0, 0, 1);
        shader.begin();
        GL11.glBegin(GL11.GL_TRIANGLES);
        GL11.glVertex2i(0,  0);
        GL11.glVertex2i(500, 0);
        GL11.glVertex2i(250, 250);
        GL11.glEnd();
        shader.end();

    }

person devCorner    schedule 15.06.2015    source источник
comment
Вам следует проверить GL_LINK_STATUS, а также GL_COMPILE_STATUS. Также весьма полезен glGetError. Рисует ли он без активного шейдера? В противном случае это может указывать на рисунок за пределами проекции / вида.   -  person jozxyqk    schedule 15.06.2015
comment
@jozxyqk отлично компилируется без шейдера, но когда я использую шейдер, ничего не отрисовывается. Я добавил флаг и функцию glGetError (), как вы сказали, однако я нигде не получаю никаких ошибок.   -  person devCorner    schedule 15.06.2015
comment
За исключением опечатки { во фрагментном шейдере и, предположительно, строки fragShader = GL20.glCreateShader(GL20.GL_FRAGMENT_SHADER);, которая просто не показана, я не могу найти ничего очевидного. Останавливает ли компиляция шейдеров появление синтаксической ошибки? Вы недавно обновляли драйверы?   -  person jozxyqk    schedule 15.06.2015
comment
Проблема была в том, что не удалось инициализировать переменную фрагментного шейдера! Большое спасибо!   -  person devCorner    schedule 15.06.2015
comment
Вы можете добавить это в качестве ответа и принять его.   -  person Dawnkeeper    schedule 15.06.2015


Ответы (1)


Проблема была решена благодаря jozxyqk. Я забыл инициализировать переменную фрагментного шейдера.

fragShader = GL20.glCreateShader(GL20.GL_FRAGMENT_SHADER);

Добавив эту строку кода, проблема была решена.

person devCorner    schedule 15.06.2015