【发布时间】:2021-10-18 17:06:48
【问题描述】:
为什么这段代码不能在运行 OpenGL 4.5 上 RTX 2080 TI 规格的 GPU 的计算机上运行,而在运行非 Nvidia GPU 的计算机上运行?
我尝试隔离代码段。下面的代码会产生错误:
“编译片段着色器失败” “统一变量任务,调制,uTileSize 不存在”。
(我有辅助函数来检查着色器问题)。
#version 450 core
in vec2 pos;
in vec3 color;
in vec2 uv;
out vec4 finalColor;
const vec3 C0 = vec3(1, 0, 1);
const vec3 C1 = vec3(0, 0.68, 0.94);
uniform int task;
uniform bool modulate;
uniform float uTileSize;
uniform sampler2D text;
void main(){
if(task == 0){
finalColor = vec4(color, 1.0);
} else if(task == 1){
float tilePosX = floor(gl_FragCoord.x / 32);
float tilePosY = floor(gl_FragCoord.y / 32);
if(mod(tilePosX + tilePosY, 2)){
finalColor = modulate ? vec4(C0 * color, 1.0) : vec4(C0, 1.0);
} else {
finalColor = modulate ? vec4(C1 * color, 1.0) : vec4(C1, 1.0);
}
} else if(task == 2){
float tilePosX = floor(gl_FragCoord.x / uTileSize);
float tilePosY = floor(gl_FragCoord.y / uTileSize);
if(mod(tilePosX + tilePosY, 2)){
finalColor = modulate ? vec4(C0 * color, 1.0) : vec4(C0, 1.0);
} else {
finalColor = modulate ? vec4(C1 * color, 1.0) : vec4(C1, 1.0);
}
} else if(task == 3){
vec4 texture_color = texture(text, uv);
finalColor = modulate ? texture_color * vec4(color, 1.0) : texture_color;
} else if(task == 4){
vec4 texture_color = texture(text, uv * 4);
finalColor = modulate ? texture_color * vec4(color, 1.0) : texture_color;
} else if(task == 5){
vec4 texture_color = texture(text, uv * 4);
finalColor = modulate ? texture_color * vec4(color, 1.0) : texture_color;
} else if(task == 6){
vec4 texture_color = texture(text, uv * 4);
finalColor = modulate ? texture_color * vec4(color, 1.0) : texture_color;
}
}
以下代码检查变量是否存在:
void GLSLShader::SetUniform(GLchar const *name, GLboolean val) {
GLint loc = glGetUniformLocation(pgm_handle, name);
if (loc >= 0) {
glUniform1i(loc, val);
}
else {
std::cout << "Uniform variable " << name << " doesn't exist" << std::endl;
}
}
void GLSLShader::SetUniform(GLchar const *name, GLint val) {
GLint loc = glGetUniformLocation(pgm_handle, name);
if (loc >= 0) {
glUniform1i(loc, val);
}
else {
std::cout << "Uniform variable " << name << " doesn't exist" << std::endl;
}
}
void GLSLShader::SetUniform(GLchar const *name, GLfloat val) {
GLint loc = glGetUniformLocation(pgm_handle, name);
if (loc >= 0) {
glUniform1f(loc, val);
}
else {
std::cout << "Uniform variable " << name << " doesn't exist" << std::endl;
}
}
void GLSLShader::SetUniform(GLchar const *name, GLfloat x, GLfloat y) {
GLint loc = glGetUniformLocation(pgm_handle, name);
if (loc >= 0) {
glUniform2f(loc, x, y);
} else {
std::cout << "Uniform variable " << name << " doesn't exist" << std::endl;
}
}
void GLSLShader::SetUniform(GLchar const *name, GLfloat x, GLfloat y, GLfloat z) {
GLint loc = glGetUniformLocation(pgm_handle, name);
if (loc >= 0) {
glUniform3f(loc, x, y, z);
}
else {
std::cout << "Uniform variable " << name << " doesn't exist" << std::endl;
}
}
void
GLSLShader::SetUniform(GLchar const *name, GLfloat x, GLfloat y, GLfloat z, GLfloat w) {
GLint loc = glGetUniformLocation(pgm_handle, name);
if (loc >= 0) {
glUniform4f(loc, x, y, z, w);
} else {
std::cout << "Uniform variable " << name << " doesn't exist" << std::endl;
}
}
void GLSLShader::SetUniform(GLchar const *name, glm::vec2 &val) {
GLint loc = glGetUniformLocation(pgm_handle, name);
if (loc >= 0) {
glUniform2f(loc, val.x, val.y);
}
else {
std::cout << "Uniform variable " << name << " doesn't exist" << std::endl;
}
}
void GLSLShader::SetUniform(GLchar const *name, glm::vec3 &val) {
GLint loc = glGetUniformLocation(pgm_handle, name);
if (loc >= 0) {
glUniform3f(loc, val.x, val.y, val.z);
}
else {
std::cout << "Uniform variable " << name << " doesn't exist" << std::endl;
}
}
void GLSLShader::SetUniform(GLchar const *name, glm::vec4 &val) {
GLint loc = glGetUniformLocation(pgm_handle, name);
if (loc >= 0) {
glUniform4f(loc, val.x, val.y, val.z, val.w);
}
else {
std::cout << "Uniform variable " << name << " doesn't exist" << std::endl;
}
}
void GLSLShader::SetUniform(GLchar const *name, glm::mat3 &val) {
GLint loc = glGetUniformLocation(pgm_handle, name);
if (loc >= 0) {
glUniformMatrix3fv(loc, 1, GL_FALSE, &val[0][0]);
}
else {
std::cout << "Uniform variable " << name << " doesn't exist" << std::endl;
}
}
void GLSLShader::SetUniform(GLchar const *name, glm::mat4 &val) {
GLint loc = glGetUniformLocation(pgm_handle, name);
if (loc >= 0) {
glUniformMatrix4fv(loc, 1, GL_FALSE, &val[0][0]);
}
else {
std::cout << "Uniform variable " << name << " doesn't exist" << std::endl;
}
}
这就是我设置制服的方式:
int task_number = 0;
bool modulate = false;
float tile_size = 16;
shdrpgms[shd_ref].Use();
shdrpgms[shd_ref].SetUniform("task", task_number);
shdrpgms[shd_ref].SetUniform("modulate", modulate);
shdrpgms[shd_ref].SetUniform("uTileSize", tile_size);
有什么提示可以让我调查吗?
【问题讨论】:
-
错误信息是什么?是否使用明确的
float帮助(例如mod(2.0F, 3.0F))?如果将mods 重写为x - y * floor(x/y)是否有效? -
-
GLSL 找不到统一变量
task、modulate和uTileSize。您可以尝试在之前C0和C1声明它们吗? -
您确定显示的代码是确实正在编译的代码吗?请编辑您的问题以逐字显示确切的错误消息 - 包括行号/列号(如果存在)。
-
这些 glUniform* 包装器增加了一层潜在的错误。现在看起来着色器没有编译,因此自然无法上传任何统一值。然而,我们仍然不知道编译错误信息。在尝试编译片段着色器的调用之后,
glGetShaderInfoLog(可能被包装)返回的字符串是什么?