照明不';在OpenGL中不显示
我正试图使用我的课本示例在OpenGL中实现点源定向照明。我正在显示一个以原点为中心的矩形,并在着色器中进行照明计算。矩形出现了,但它是黑色的,即使当我试图把彩色灯光。矩形的法线都是(0,1.0,0)。我没有做任何非均匀缩放,因此常规模型视图矩阵也应该变换法线 我有为着色器设置灯光参数(作为制服)和材质参数(也作为制服)的代码。没有逐顶点颜色信息照明不';在OpenGL中不显示,opengl,Opengl,我正试图使用我的课本示例在OpenGL中实现点源定向照明。我正在显示一个以原点为中心的矩形,并在着色器中进行照明计算。矩形出现了,但它是黑色的,即使当我试图把彩色灯光。矩形的法线都是(0,1.0,0)。我没有做任何非均匀缩放,因此常规模型视图矩阵也应该变换法线 我有为着色器设置灯光参数(作为制服)和材质参数(也作为制服)的代码。没有逐顶点颜色信息 void InitMaterial() { color material_ambient = color(1.0, 0.0, 1.0);
void InitMaterial()
{
color material_ambient = color(1.0, 0.0, 1.0);
color material_diffuse = color(1.0, 0.8, 0.0);
color material_specular = color(1.0, 0.8, 0.0);
float material_shininess = 100.0;
// set uniforms for current program
glUniform3fv(glGetUniformLocation(Programs[lightingType], "materialAmbient"), 1, material_ambient);
glUniform3fv(glGetUniformLocation(Programs[lightingType], "materialDiffuse"), 1, material_diffuse);
glUniform3fv(glGetUniformLocation(Programs[lightingType], "materialSpecular"), 1, material_specular);
glUniform1f(glGetUniformLocation(Programs[lightingType], "shininess"), material_shininess);
}
对于灯光:
void InitLight()
{
// need light direction and light position
point4 light_position = point4(0.0, 0.0, -1.0, 0.0);
color light_ambient = color(0.2, 0.2, 0.2);
color light_diffuse = color(1.0, 1.0, 1.0);
color light_specular = color(1.0, 1.0, 1.0);
glUniform3fv(glGetUniformLocation(Programs[lightingType], "lightPosition"), 1, light_position);
glUniform3fv(glGetUniformLocation(Programs[lightingType], "lightAmbient"), 1, light_ambient);
glUniform3fv(glGetUniformLocation(Programs[lightingType], "lightDiffuse"), 1, light_diffuse);
glUniform3fv(glGetUniformLocation(Programs[lightingType], "lightSpecular"), 1, light_specular);
}
片段着色器是一个简单的直通着色器,它将颜色设置为顶点着色器的一个输入。以下是顶点着色器:
#version 150
in vec4 vPosition;
in vec3 vNormal;
out vec4 color;
uniform vec4 materialAmbient, materialDiffuse, materialSpecular;
uniform vec4 lightAmbient, lightDiffuse, lightSpecular;
uniform float shininess;
uniform mat4 modelView;
uniform vec4 lightPosition;
uniform mat4 projection;
void main()
{
// Transform vertex position into eye coordinates
vec3 pos = (modelView * vPosition).xyz;
vec3 L = normalize(lightPosition.xyz - pos);
vec3 E = normalize(-pos);
vec3 H = normalize(L + E);
// Transform vertex normal into eye coordinates
vec3 N = normalize(modelView * vec4(vNormal, 0.0)).xyz;
// Compute terms in the illumination equation
vec4 ambient = materialAmbient * lightAmbient;
float Kd = max(dot(L, N), 0.0);
vec4 diffuse = Kd * materialDiffuse * lightDiffuse;
float Ks = pow(max(dot(N, H), 0.0), shininess);
vec4 specular = Ks * materialSpecular * lightSpecular;
if(dot(L, N) < 0.0) specular = vec4(0.0, 0.0, 0.0, 1.0);
gl_Position = projection * modelView * vPosition;
color = ambient + diffuse + specular;
color.a = 1.0;
}
#版本150
在vec4位置;
在vec3vnormal中;
输出vec4颜色;
均匀矢量4材料组、材料差异、材料特殊性;
均匀vec4光环境、光漫反射、光镜面反射;
均匀的浮光度;
统一mat4模型视图;
均匀vec4光位;
均匀mat4投影;
void main()
{
//将顶点位置转换为眼睛坐标
vec3位置=(模型视图*位置).xyz;
vec3 L=标准化(lightPosition.xyz-pos);
vec3 E=正常化(-pos);
vec3 H=标准化(L+E);
//将顶点法线变换为眼睛坐标
vec3 N=规格化(modelView*vec4(vNormal,0.0)).xyz;
//计算照明方程中的项
vec4环境=材料环境*光环境;
浮点数Kd=最大值(点(长,宽),0.0);
vec4漫反射=Kd*材质扩散*光漫反射;
浮子Ks=功率(最大值(点(N,H),0.0),光泽度);
vec4镜面反射=Ks*材料镜面反射*光镜面反射;
如果(点(L,N)<0.0)镜面反射=vec4(0.0,0.0,0.0,1.0);
gl_位置=投影*模型视图*位置;
颜色=环境光+漫反射+镜面反射;
颜色a=1.0;
}
好的,现在开始工作了。解决方案是用glUniform4fv替换glUniform3fv,我想是因为glsl对应物是vec4而不是vec3。我认为它可以识别这一点,只需在末端添加1.0,但没有。您提到矩形的法线为(0,1,0),位于原点,灯光位于(0,0,-1)这意味着光源垂直于物体,所以光向量和法线的点积为0。您可以尝试移动灯光或矩形,看看是否会产生差异。法线在模型空间中为(0,1,0),但灯光位置在眼睛空间中。我试着改变灯的位置,但没有用。我不确定问题出在哪里,但你可以尝试一些不同的方法来缩小范围。首先尝试将顶点着色器中的颜色变量设置为硬编码颜色,以验证颜色是否正确地从顶点传递到片段着色器。第二种方法是分别检查照明的每个组件。首先将“颜色”设置为“环境光”,然后设置为“漫反射”和“镜面反射”,以检查每个组件是否按预期进行了计算。谢谢,我会尝试的。