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;