Java Opengl: отбрасывание текстурного фона с помощью шейдеров

Я пытаюсь следовать этому уроку, чтобы удалить цвет фона текстуры с помощью шейдера. https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/discard.php

Все работает правильно, я скопировал код шейдера непосредственно из учебника, однако фрагментный шейдер выдает несколько ошибок.

sampler2D myTexture;
           varying vec2 vTexCoord;
void main (void) 
{  
   vec4 color = texture2D(myTexture, vTexCoord); 

    if (color.rgb == vec3(1.0,0.0,0.0))
      discard; 

   gl_FragColor = color;
}

ОШИБКА: 0:3: "sampler2D": сэмплеры должны быть одинаковыми
ОШИБКА: 0:7: 'myTexture': необъявленный идентификатор
ОШИБКА: 0:7: 'vTexCoord': необъявленный идентификатор
ОШИБКА: 0:7: 'texture2D': не найдена соответствующая перегруженная функция (используется неявное преобразование)
ОШИБКА: 0:7: '=': невозможно преобразовать из 'const float' в '4-компонентный вектор с плавающей точкой'

Я заменил необъявленные идентификаторы своей текстурой и Vec2, но они остались неопознанными. Я предполагаю, что они должны быть загружены как-то.

Это, вероятно, вызывает ошибку "... нет совпадений перегружен...". Два других я не понимаю, код взят прямо из учебника, поэтому таких проблем не должно быть в теории.

Моя версия lwjgl 2.9.1

Вот соответствующий источник:

    shaderProgram = glCreateProgram();
    vertexShader  = glCreateShader(GL_VERTEX_SHADER);
    fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);

    StringBuilder vertexShaderSource   = new StringBuilder();
    StringBuilder fragmentShaderSource = new StringBuilder();

    try{
        BufferedReader reader = new BufferedReader(new FileReader("src/shader.vert"));
        String line;
        line = reader.readLine();

        while(line != null){
            line = reader.readLine();

            if(line != null){
                vertexShaderSource.append(line).append('\n');
            }
        }
        reader.close();


    } catch (IOException e) {
        System.err.println("Vertex no load.");
        Display.destroy();
        System.exit(1);
    }

    try{
        BufferedReader reader = new BufferedReader(new FileReader("src/shader.frag"));
        String line;
        //line = reader.readLine();

        while(true){
            line = reader.readLine();

            if(line == null){
                break;
            }

            fragmentShaderSource.append(line).append('\n');
        }
        reader.close();


    } catch (IOException e) {
        System.err.println("Frag no load.");
        Display.destroy();
        System.exit(1);
    }
    System.out.println(fragmentShaderSource);

    glShaderSource(vertexShader, vertexShaderSource);
    glCompileShader(vertexShader);
    if(glGetShader(vertexShader, GL_COMPILE_STATUS) == GL_FALSE){
        System.err.println("Vertex no compile");
    }
    glShaderSource(fragmentShader, fragmentShaderSource);
    glCompileShader(fragmentShader);
    if(glGetShader(fragmentShader, GL_COMPILE_STATUS) == GL_FALSE){
        System.err.println("frag no compile");
    }

    System.out.println("Shader.frag Error Log\n" + glGetShaderInfoLog(fragmentShader, 1024));

    glAttachShader(shaderProgram, vertexShader);
    glAttachShader(shaderProgram, fragmentShader);
    glLinkProgram(shaderProgram);
    glValidateProgram(shaderProgram);

1 ответ

Решение

Унифицированные переменные в GLSL должны начинаться с uniform ключевое слово. Чтобы все исправить, замените первую строку на

uniform sampler2D myTexture;
Другие вопросы по тегам