GLSL Shader рисува само черен екран LWJGL

Аз съм много нов в шейдърите и имам някакъв GLSL код, за да компилирам правилно (без никакви грешки на компилатора) и по някаква причина продължавам да получавам черен екран. Използвам LWJGL. Продължавам да получавам черен екран, когато се опитвам да изобразя триъгълник, въпреки че трябва да е бял според цвета, който предадох на фрагментния шейдър. Публикувах фрагменти от кода по-долу, надявам се, че има достатъчно, за да разбера какъв е проблемът.

Изходен код на фрагментен шейдър

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

Изходен код на Vertex Shader

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);

Активиране и деактивиране на Shader Code

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