Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
照明不';在OpenGL中不显示_Opengl - Fatal编程技术网

照明不';在OpenGL中不显示

照明不';在OpenGL中不显示,opengl,Opengl,我正试图使用我的课本示例在OpenGL中实现点源定向照明。我正在显示一个以原点为中心的矩形,并在着色器中进行照明计算。矩形出现了,但它是黑色的,即使当我试图把彩色灯光。矩形的法线都是(0,1.0,0)。我没有做任何非均匀缩放,因此常规模型视图矩阵也应该变换法线 我有为着色器设置灯光参数(作为制服)和材质参数(也作为制服)的代码。没有逐顶点颜色信息 void InitMaterial() { color material_ambient = color(1.0, 0.0, 1.0);

我正试图使用我的课本示例在OpenGL中实现点源定向照明。我正在显示一个以原点为中心的矩形,并在着色器中进行照明计算。矩形出现了,但它是黑色的,即使当我试图把彩色灯光。矩形的法线都是(0,1.0,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),但灯光位置在眼睛空间中。我试着改变灯的位置,但没有用。我不确定问题出在哪里,但你可以尝试一些不同的方法来缩小范围。首先尝试将顶点着色器中的颜色变量设置为硬编码颜色,以验证颜色是否正确地从顶点传递到片段着色器。第二种方法是分别检查照明的每个组件。首先将“颜色”设置为“环境光”,然后设置为“漫反射”和“镜面反射”,以检查每个组件是否按预期进行了计算。谢谢,我会尝试的。