首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GLSL光/高光摄像机移动

GLSL光/高光摄像机移动
EN

Stack Overflow用户
提问于 2011-12-04 14:24:55
回答 1查看 1.7K关注 0票数 1

VC++ 2010,OpenGL,GLSL,SDL

我移动到着色器,并遇到了一个问题,最初发生的时候,使用ogl管道。也就是说,光的位置似乎指向我的相机面对的任何方向。在ogl管道中,这只是镜面上的亮点,它可以固定如下:

代码语言:javascript
复制
glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, 1.0f);

以下是两个着色器:

顶点

代码语言:javascript
复制
varying vec3 lightDir,normal;

void main()
{
    normal = normalize(gl_NormalMatrix * gl_Normal);
    lightDir = normalize(vec3(gl_LightSource[0].position));

    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = ftransform();
}

片段

代码语言:javascript
复制
varying vec3 lightDir,normal;
uniform sampler2D tex;

void main()
{
    vec3 ct,cf;
    vec4 texel;
    float intensity,at,af;

    intensity = max(dot(lightDir,normalize(normal)),0.0);

    cf = intensity * (gl_FrontMaterial.diffuse).rgb + 
                        gl_FrontMaterial.ambient.rgb;
    af = gl_FrontMaterial.diffuse.a;

    texel = texture2D(tex,gl_TexCoord[0].st);
    ct = texel.rgb;
    at = texel.a;

    gl_FragColor = vec4(ct * cf, at * af);  
}

任何帮助都将不胜感激!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-04 15:02:12

问题是:你希望灯光在哪个坐标系(参考框架)?可能是“世界”。

然而,OpenGL的固定功能管道没有世界坐标的概念,因为它使用了一个模型视图矩阵,它直接从眼睛(摄像机)坐标转换到模型坐标。为了有“固定”的灯,你可以做其中之一:

  • 经典的OpenGL方法是,每一帧都将模型视图矩阵设置为仅作为视图转换(即是希望指定光位置的坐标系统),然后使用glLight设置位置(指定用于将模型视图矩阵应用于输入)。由于使用着色器,您还可以使用单独的模型和视图矩阵,并让着色器对顶点同时应用(而不是使用ftransform),但只对顶点应用视图矩阵,而只对光线应用视图矩阵。然而,这意味着要进行更多的每个顶点矩阵操作,除非您是在寻找清晰度而不是性能,否则这可能不是一个特别好的主意。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8375950

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档