【问题标题】:OpenGL Fragment Shader not compliable [closed]OpenGL片段着色器不兼容[关闭]
【发布时间】: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 找不到统一变量 taskmodulateuTileSize。您可以尝试在之前 C0C1 声明它们吗?
  • 您确定显示的代码是确实正在编译的代码吗?请编辑您的问题以逐字显示确切的错误消息 - 包括行号/列号(如果存在)。
  • 这些 glUniform* 包装器增加了一层潜在的错误。现在看起来着色器没有编译,因此自然无法上传任何统一值。然而,我们仍然不知道编译错误信息。在尝试编译片段着色器的调用之后,glGetShaderInfoLog(可能被包装)返回的字符串是什么?

标签: c++ opengl glsl


【解决方案1】:

我听了上面cmets中关于检查glGetShaderInfoLog返回的字符串的Yun的建议(profile:https://stackoverflow.com/users/16632281/yun),发现问题出在类型转换上

mod(tilePosX + tilePosY, 2) 在第 24 行和第 33 行转换为 if 条件内的布尔值。我通过将其更改为 if (mod(tilePosX + tilePosY, 2) > 0) 解决了这个问题,此后没有任何投诉。

【讨论】:

  • 这实际上是根据GLSL specifications (4.1.10) 的正确行为:没有可以隐式转换为bool 的类型。然而,每个标量都可以使用其构造函数转换为布尔值,例如bool(2.0).
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多