片段着色器似乎没有输出任何颜色
Fragment Shader doesn't seem to output any colors
我最近决定开始学习 OpenGL,并给自己买了一本关于 OpenGL Core 3.3 的书。书一般都是讲C++的
所以,经过一番寻找,我找到了一个我更擅长的语言库,它提供了几乎相同的功能:lwjgl。
我设法用基本的顶点和片段着色器绘制了几个形状。但是,当我尝试让片段着色器输出白色以外的颜色时,它没有任何影响;形状仍然呈现为白色。
我的问题是着色器本身是否有问题或者我没有正确加载它。
我的 Main.java 中的代码(ShaderLoader 只是一个加载 .vs(顶点着色器)和 .fs(片段着色器)文件的 class):
try {
String vshaderSource, fshaderSource;
vshaderSource = ShaderLoader.loadShaderSource(vertexShader, Path.of("main.vs"));
glShaderSource(vertexShader, vshaderSource);
fshaderSource = ShaderLoader.loadShaderSource(fragmentShader, Path.of("main.fs"));
glShaderSource(fragmentShader, fshaderSource);
} catch (IOException e) {
log.severe(String.format("Loading of Shaders failed due to IOException: %s", e.getMessage()));
return;
}
glCompileShader(vertexShader);
int success = glGetShaderi(vertexShader, GL_COMPILE_STATUS);
String infoLog;
if(success == 0) {
infoLog = glGetShaderInfoLog(vertexShader);
log.severe("Shader Compilation failed: " + infoLog);
}
glCompileShader(fragmentShader);
success = glGetShaderi(fragmentShader, GL_COMPILE_STATUS);
if(success == 0) {
infoLog = glGetShaderInfoLog(fragmentShader);
log.severe("Shader Compilation failed:" + infoLog);
}
int shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
glUseProgram(shaderProgram);
//In the rendering Loop
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glUseProgram(shaderProgram);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
顶点着色器main.vs:
#version 330 core
layout (location = 0) in vec3 aPos;
out vec4 vertexColor;
void main()
{
gl_Position = vec4(aPos, 1.0);
vertexColor = vec4(0.5, 0.0, 0.0, 1);
}
片段着色器main.fs:
#version 330 core
in vec4 vertexColor;
out vec4 FragColor;
void main()
{
FragColor = vertexColor;
};
您不是 glLinkProgram
着色器程序。因此,在将着色器附加到程序和再次分离它们之间,您应该添加 glLinkProgram(shaderProgram)
.
我最近决定开始学习 OpenGL,并给自己买了一本关于 OpenGL Core 3.3 的书。书一般都是讲C++的
所以,经过一番寻找,我找到了一个我更擅长的语言库,它提供了几乎相同的功能:lwjgl。 我设法用基本的顶点和片段着色器绘制了几个形状。但是,当我尝试让片段着色器输出白色以外的颜色时,它没有任何影响;形状仍然呈现为白色。
我的问题是着色器本身是否有问题或者我没有正确加载它。 我的 Main.java 中的代码(ShaderLoader 只是一个加载 .vs(顶点着色器)和 .fs(片段着色器)文件的 class):
try {
String vshaderSource, fshaderSource;
vshaderSource = ShaderLoader.loadShaderSource(vertexShader, Path.of("main.vs"));
glShaderSource(vertexShader, vshaderSource);
fshaderSource = ShaderLoader.loadShaderSource(fragmentShader, Path.of("main.fs"));
glShaderSource(fragmentShader, fshaderSource);
} catch (IOException e) {
log.severe(String.format("Loading of Shaders failed due to IOException: %s", e.getMessage()));
return;
}
glCompileShader(vertexShader);
int success = glGetShaderi(vertexShader, GL_COMPILE_STATUS);
String infoLog;
if(success == 0) {
infoLog = glGetShaderInfoLog(vertexShader);
log.severe("Shader Compilation failed: " + infoLog);
}
glCompileShader(fragmentShader);
success = glGetShaderi(fragmentShader, GL_COMPILE_STATUS);
if(success == 0) {
infoLog = glGetShaderInfoLog(fragmentShader);
log.severe("Shader Compilation failed:" + infoLog);
}
int shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
glUseProgram(shaderProgram);
//In the rendering Loop
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glUseProgram(shaderProgram);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
顶点着色器main.vs:
#version 330 core
layout (location = 0) in vec3 aPos;
out vec4 vertexColor;
void main()
{
gl_Position = vec4(aPos, 1.0);
vertexColor = vec4(0.5, 0.0, 0.0, 1);
}
片段着色器main.fs:
#version 330 core
in vec4 vertexColor;
out vec4 FragColor;
void main()
{
FragColor = vertexColor;
};
您不是 glLinkProgram
着色器程序。因此,在将着色器附加到程序和再次分离它们之间,您应该添加 glLinkProgram(shaderProgram)
.