Java Opengl:使用着色器丢弃纹理背景
Java Opengl: Discarding Texture Background with Shaders
我正在尝试按照本教程使用着色器去除纹理的背景颜色。
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' 转换为“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);
Uniform variables in GLSL 必须以 uniform
关键字开头。所以要解决所有问题,请将第一行替换为
uniform sampler2D myTexture;
我正在尝试按照本教程使用着色器去除纹理的背景颜色。 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' 转换为“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);
Uniform variables in GLSL 必须以 uniform
关键字开头。所以要解决所有问题,请将第一行替换为
uniform sampler2D myTexture;