【发布时间】:2015-10-15 12:54:33
【问题描述】:
我正在尝试按照本教程使用着色器移除纹理的背景颜色。 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-component vector of float”
我用我的纹理和 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);
【问题讨论】:
-
您的目标是哪个 OpenGL 版本?基本上必须在 sampler2D 前面添加一个“制服”。
-
@BDL:That tutorial targets
ARB_shading_language_100。尽管即使在ARB_shading_language_100中,采样器也需要uniform,但也许教程作者使用的是非常 许可的“GLSL”编译器。 -
哇,那是一个非常古老的版本:)
-
@BDL:是的。那一个关键字修复了所有错误。我不明白 /how/ 但我会接受它的本质。把它放在答案中,我会接受。
-
一个问题是着色器似乎适用于一切,我不能通过使用 glUseProgram(0) 来“停止使用着色器”,这显然是应该起作用的。有没有办法在着色图像后停止着色器?
标签: opengl textures shader lwjgl color-key