Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.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
Ios OpenGL ES 2.0点光源着色器_Ios_Opengl Es_Glkit - Fatal编程技术网

Ios OpenGL ES 2.0点光源着色器

Ios OpenGL ES 2.0点光源着色器,ios,opengl-es,glkit,Ios,Opengl Es,Glkit,我目前正在尝试编写一个着色器,它应该在OpenGLES2.0中包含一个简单的点光源,但它不太有效 我构建了自己的小场景图,每个对象(目前只有方框)都有自己的平移/旋转/缩放,渲染效果很好。每个框指定其自己的模型视图和法线矩阵,并且它们都使用相同的投影矩阵 对于每个对象,我将矩阵和灯光位置作为一个统一的对象传递给着色器 如果对象不旋转,灯光工作正常,但一旦对象旋转,灯光似乎会随着对象旋转,而不是停留在同一位置 下面是一些代码。 首先,创建矩阵: GLKMatrix4 projectionMatri

我目前正在尝试编写一个着色器,它应该在OpenGLES2.0中包含一个简单的点光源,但它不太有效

我构建了自己的小场景图,每个对象(目前只有方框)都有自己的平移/旋转/缩放,渲染效果很好。每个框指定其自己的模型视图和法线矩阵,并且它们都使用相同的投影矩阵

对于每个对象,我将矩阵和灯光位置作为一个统一的对象传递给着色器

如果对象不旋转,灯光工作正常,但一旦对象旋转,灯光似乎会随着对象旋转,而不是停留在同一位置

下面是一些代码。 首先,创建矩阵:

GLKMatrix4 projectionMatrix = GLKMatrix4MakePerspective(GLKMathDegreesToRadians(65.0f), aspect, 0.1f, 100.0f);
GLKMatrix4 modelViewMatrix = GLKMatrix4MakeTranslation(0.0f, 0.0f, 0.0f);
每个节点计算自己的变换矩阵,其中包含平移/旋转/缩放,并将其与modelViewMatrix相乘:

modelViewMatrix = GLKMatrix4Multiply(modelViewMatrix, transformation);
该矩阵将传递给着色器,并在渲染对象后恢复旧矩阵

法向矩阵的计算如下:

GLKMatrix3InvertAndTranspose(GLKMatrix4GetMatrix3(modelViewMatrix), NULL);
顶点着色器:

attribute vec4 Position;
attribute vec2 TexCoordIn;
attribute vec3 Normal;

uniform mat4 modelViewProjectionMatrix;
uniform mat4 modelViewMatrix;
uniform mat3 normalMatrix;

uniform vec3 lightPosition;

varying vec2 TexCoordOut;
varying vec3 n, PointToLight;

void main(void) {
    gl_Position =  modelViewProjectionMatrix * Position;
    n = normalMatrix * Normal;

    PointToLight = ((modelViewMatrix * vec4(lightPosition,1.0)) - (modelViewMatrix * Position)).xyz;

    // Pass texCoord
    TexCoordOut = TexCoordIn;
}
片段着色器:

varying lowp vec2 TexCoordOut;
varying highp vec3 n, PointToLight;

uniform sampler2D Texture;

void main(void) {
    gl_FragColor = texture2D(Texture, TexCoordOut);

    highp vec3 nn = normalize(n);
    highp vec3 L = normalize(PointToLight);

    lowp float NdotL = clamp(dot(n, L), -0.8, 1.0);
    gl_FragColor *= (NdotL+1.)/2.;
}

我猜指示灯的计算结果是错误的,但我不知道出了什么问题。

我终于知道出了什么问题

我不需要将lightPosition与modelViewMatrix相乘,而只需要将其与viewMatrix相乘,后者只包含摄影机的变换,而不包含长方体的变换:

PointToLight = ((viewMatrix * vec4(lightPosition,1.0)) - (viewMatrix * modelMatrix * Position)).xyz;
现在它工作得很好