首页 > 解决方案 > 通过 glUniform1fv (...) 或 glUniform1f(...) 将值为 0.0f 的浮点变量传输到着色器时出现问题

问题描述

如果我在使用之前没有将 material.Ns 设置为0.0f(我将其值设置为 0.0f 以外的正数)shader.setUniform1fv("material.Ns", 1, &(material.Ns));material.Ns 是一个浮点变量,用于设置着色器中的光泽度),它会工作,我会得到正确的高光结果,但是当我将 material.Ns 设置为 0.0f,然后使用 shader.setUniform1fv(...) 将 material.Ns 的值转移到着色器中的 material.Ns 时,我可以'没有得到正确的突出显示结果。

另外,如果我在 shader 中硬编码 shinniness 的值,比如下面的代码

float shininess = 0.0f;

得到的结果也是正确的。

着色器::setUniform1fv(...):

void Shader::setUniform1fv(const string &name, int count, float *value) {
    int addr = glGetUniformLocation(sprogram, name.c_str()); // sprogram is the shader id
    glUniform1fv(addr, count, value);
}

这是我的片段着色器代码:

#version 330 core

struct Material {
    vec3 Ka;
    vec3 Kd;
    vec3 Ks;
    vec3 Ke;
    vec3 Kt;
    float Ns;
    float Ni;
    float d;
    int illum;
    
    sampler2D map_Ka;
    sampler2D map_Kd;
    sampler2D map_Ks;
    sampler2D map_Ke;
    sampler2D map_Ns;
    sampler2D map_d;
    sampler2D map_bump;
};

struct DirLight{
    vec3 direction;
    vec3 ambient;
    vec3 diffuse;
    vec3 specular;
};

uniform Material material;
uniform vec3 viewPos;
uniform DirLight dirLight;

in vec2 TexCoords;
in vec3 Normal;
in vec3 FragPos;

out vec4 FragColor;

void main(){
    /* Texture*/
    vec3 texKa = vec3(texture(material.map_Ka, TexCoords));
    vec3 texKd = vec3(texture(material.map_Kd, TexCoords));
    vec3 texKs = vec3(texture(material.map_Ks, TexCoords));
    vec3 texKe = vec3(texture(material.map_Ke, TexCoords));
    
    /* Final */
    vec3 Ka = material.Ka * texKa;
    vec3 Kd = material.Kd * texKd;
    vec3 Ks = material.Ks * texKs;
    vec3 Ke = material.Ke * texKe;
    
    /* Directions */
    vec3 viewDir = normalize(viewPos - FragPos);
    vec3 lightDir = normalize(-dirLight.direction);
    vec3 reflectDir = normalize(reflect(-lightDir, Normal));
    vec3 halfwayDir = normalize(lightDir + viewDir);
    
    /* Shininese */
    float shininess = material.Ns; // Here's the problem
    
    /* DirLight lighting using Blinn-Phong*/
    float diff = max(dot(Normal, lightDir), 0.0);
    float spec = pow(max(dot(Normal, halfwayDir), 0.0), shininess);
    vec3 ambient = dirLight.ambient * Ka;
    vec3 diffuse = dirLight.diffuse * diff * Kd;
    vec3 specular = dirLight.specular * spec * Ks;
    
    vec3 result = ambient + diffuse + specular;
        
    FragColor = vec4(result, 1.0f);
}

例如: 在 c++ 文件中,我使用以下代码将 shader 中的 material.Ns 设置为 0.0f。

material.Ns = 0.0f;
shader.setUniform1fv("material.Ns", 1, &(material.Ns));

我得到的结果: 快照 1

但是当我shininess像这样在片段着色器中硬编码时

/* Shininese */
float shininess = 0.0f;
[...]
float spec = pow(max(dot(Normal, halfwayDir), 0.0), shininess);

我得到的结果:

快照 2

标签: openglfloating-pointglslshaderhighlight

解决方案


推荐阅读