opengl - 通过 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));
我得到的结果:
但是当我shininess
像这样在片段着色器中硬编码时
/* Shininese */
float shininess = 0.0f;
[...]
float spec = pow(max(dot(Normal, halfwayDir), 0.0), shininess);
我得到的结果:
解决方案
推荐阅读
- ios - 从 iOS 审核过程中了解崩溃报告
- windows - 用powershell添加本地Windows防火墙规则的最干净的方法是什么
- c# - 删除额外的正文参数或将 WebGetAttribute/WebInvokeAttribute 上的 BodyStyle 属性设置为 Wrapped
- ssl - 谷歌云 - 连接超时,TLS - 握手
- python - 如何按浮动子列表的项目对列表列表进行排序
- php - 如果在特定内容中则跳过匹配
- c# - 打包 URI NUnit 测试问题
- ios - 使用 Cocoapods 将多个 dylib 组合到 iOS 的单个框架中
- php - 如何在 PHP 脚本的 SQL 请求中不使用 IN 运算符过滤搜索结果
- c# - C# XML 反序列化为一张表中的 DataSet