OpenGL 着色器程序导致屏幕在使用时变黑
OpenGL Shader Program causing screen to go black when used
所以在我的 OpenGL 代码中,每当我尝试在我的项目中使用着色器程序时,屏幕都会保持黑色。
我故意在着色器代码中犯了一个错误,以确保错误检查有效,而且确实如此,所以当我去修复它并再次 运行 程序时,它只是显示黑屏.
我已经进入其他项目以确保着色器程序正常工作,而且确实如此,但对于这个特定项目,它们根本不起作用。
这段代码只是一个简单三角形程序的一部分。
但是如您所见,UseProgram
调用被注释掉了。
当我取消注释时,我只是黑屏。
// I'm only using this for testing purposes
static constexpr const char* vertexShaderCode = R"(
#version 460 core
layout (location = 0) in vec2 vertexPosition;
void main() {
gl_Position = vec4(vertexPosition, 0.0, 0.0);
}
)";
static constexpr const char* fragmentShaderCode = R"(
#version 460 core
out vec4 fragmentColor;
void main() {
fragmentColor = vec4(0.1, 0.1, 1.0, 1.0);
}
)";
unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderCode, nullptr);
glShaderSource(fragmentShader, 1, &fragmentShaderCode, nullptr);
glCompileShader(vertexShader);
glCompileShader(fragmentShader);
// error checking
// I've made sure it logs errors to the console, and it does.
{
int compileSuccess;
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &compileSuccess);
if (!compileSuccess) {
char infoLog[512];
glGetShaderInfoLog(vertexShader, 512, nullptr, infoLog);
cerr << "Failed to compile vertex shader!" << '\n';
cerr << "Shader Info log: " << infoLog << '\n';
}
}
{
int compileSuccess;
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &compileSuccess);
if (!compileSuccess) {
char infoLog[512];
glGetShaderInfoLog(fragmentShader, 512, nullptr, infoLog);
cerr << "Failed to compile fragment shader!" << '\n';
cerr << "Shader Info log: " << infoLog << '\n';
}
}
unsigned int shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
// This logs errors and it works as well.
{
int linkSuccess;
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &linkSuccess);
if (!linkSuccess) {
char infoLog[512];
glGetProgramInfoLog(shaderProgram, 512, nullptr, infoLog);
cerr << "Failed to link Shader Program!" << '\n';
cerr << "Shader Program Info log: " << infoLog << '\n';
}
}
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
// when this is un commented the screen stays black
//glUseProgram(shaderProgram);
// rest of code to create triangle ...
剪辑的第 4 个分量 space 坐标应为 1.0:
gl_Position = vec4(vertexPosition, 0.0, 0.0);
gl_Position = vec4(vertexPosition, 0.0, 1.0);
剪辑space坐标是Homogeneous coordinates. The normalized device coordinate is a Cartesian coordinate it is computed by dividing the x, y and z component of the clip space coordinate by the w component of the clip space coordinate (Perspective divide).
所以在我的 OpenGL 代码中,每当我尝试在我的项目中使用着色器程序时,屏幕都会保持黑色。
我故意在着色器代码中犯了一个错误,以确保错误检查有效,而且确实如此,所以当我去修复它并再次 运行 程序时,它只是显示黑屏.
我已经进入其他项目以确保着色器程序正常工作,而且确实如此,但对于这个特定项目,它们根本不起作用。
这段代码只是一个简单三角形程序的一部分。
但是如您所见,UseProgram
调用被注释掉了。
当我取消注释时,我只是黑屏。
// I'm only using this for testing purposes
static constexpr const char* vertexShaderCode = R"(
#version 460 core
layout (location = 0) in vec2 vertexPosition;
void main() {
gl_Position = vec4(vertexPosition, 0.0, 0.0);
}
)";
static constexpr const char* fragmentShaderCode = R"(
#version 460 core
out vec4 fragmentColor;
void main() {
fragmentColor = vec4(0.1, 0.1, 1.0, 1.0);
}
)";
unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER);
unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(vertexShader, 1, &vertexShaderCode, nullptr);
glShaderSource(fragmentShader, 1, &fragmentShaderCode, nullptr);
glCompileShader(vertexShader);
glCompileShader(fragmentShader);
// error checking
// I've made sure it logs errors to the console, and it does.
{
int compileSuccess;
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &compileSuccess);
if (!compileSuccess) {
char infoLog[512];
glGetShaderInfoLog(vertexShader, 512, nullptr, infoLog);
cerr << "Failed to compile vertex shader!" << '\n';
cerr << "Shader Info log: " << infoLog << '\n';
}
}
{
int compileSuccess;
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &compileSuccess);
if (!compileSuccess) {
char infoLog[512];
glGetShaderInfoLog(fragmentShader, 512, nullptr, infoLog);
cerr << "Failed to compile fragment shader!" << '\n';
cerr << "Shader Info log: " << infoLog << '\n';
}
}
unsigned int shaderProgram = glCreateProgram();
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
// This logs errors and it works as well.
{
int linkSuccess;
glGetProgramiv(shaderProgram, GL_LINK_STATUS, &linkSuccess);
if (!linkSuccess) {
char infoLog[512];
glGetProgramInfoLog(shaderProgram, 512, nullptr, infoLog);
cerr << "Failed to link Shader Program!" << '\n';
cerr << "Shader Program Info log: " << infoLog << '\n';
}
}
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
// when this is un commented the screen stays black
//glUseProgram(shaderProgram);
// rest of code to create triangle ...
剪辑的第 4 个分量 space 坐标应为 1.0:
gl_Position = vec4(vertexPosition, 0.0, 0.0);
gl_Position = vec4(vertexPosition, 0.0, 1.0);
剪辑space坐标是Homogeneous coordinates. The normalized device coordinate is a Cartesian coordinate it is computed by dividing the x, y and z component of the clip space coordinate by the w component of the clip space coordinate (Perspective divide).