【问题标题】:chamging lights while drawing in open gl在opengl中绘图时改变灯光
【发布时间】:2012-11-15 10:31:05
【问题描述】:

我对一个主题感到好奇:说我有复杂的场景 和一盏灯,我可以通过发送绘图命令来部分绘制场景 按顺序(例如 100 步)。

我可以在连续调用之间移动灯吗?例如我 会在靠近它的地方绘制带有 light0 的表,然后将 light0 移动到 墙然后画墙,然后将 light0 移动到椅子上,然后画椅子。 这将有点像这一切的组装它是合法的 否则它将无法工作,并且每个整个框架都应该有一个灯 一个职位? (同样的问题也适用于其他属性) tnx

【问题讨论】:

    标签: opengl graphics 3d rendering


    【解决方案1】:

    当然可以。灯光位置只是一个变量,您可以像这样传递给对象着色器:

    uniform vec4 fvAmbient;
    uniform vec4 fvSpecular;
    uniform vec4 fvDiffuse;
    uniform float fSpecularPower;
    
    uniform sampler2D baseMap;
    
    varying vec2 Texcoord;
    varying vec3 ViewDirection;
    varying vec3 LightDirection; <------  here is your light position
    varying vec3 Normal;
    
    void main( void )
    {
       vec3  fvLightDirection = normalize( LightDirection );
       vec3  fvNormal         = normalize( Normal );
       float fNDotL           = dot( fvNormal, fvLightDirection ); 
    
       vec3  fvReflection     = normalize( ( ( 2.0 * fvNormal ) * fNDotL ) - fvLightDirection ); 
       vec3  fvViewDirection  = normalize( ViewDirection );
       float fRDotV           = max( 0.0, dot( fvReflection, fvViewDirection ) );
    
       vec4  fvBaseColor      = texture2D( baseMap, Texcoord );
    
       vec4  fvTotalAmbient   = fvAmbient * fvBaseColor; 
       vec4  fvTotalDiffuse   = fvDiffuse * fNDotL * fvBaseColor; 
       vec4  fvTotalSpecular  = fvSpecular * ( pow( fRDotV, fSpecularPower ) );
    
       gl_FragColor = ( fvTotalAmbient + fvTotalDiffuse + fvTotalSpecular );
    
    }
    

    它是一个带有纹理的着色器和一个无限远的点光源。

    如果您需要在对象之间移动光源,则渲染它就像更改变量值一样容易。

    【讨论】:

    • 他可能使用的是固定功能灯,因为他说的是LIGHT0。以这种方式使用的匈牙利符号实际上只会混淆程序。您的着色器也缺少 #version 行。
    • 是的,你可能是对的。但是 FFP 有点过时了,早就被遗忘了,所以我不太确定。但如果他是学生,那可能就是个例。
    • 一点都没有忘记。互联网上大多数关于 OpenGL 的介绍,以及几乎所有(印刷)书籍都是针对即时模式 FFP OpenGL 编写的。它肯定不再有用了,但它比一个体面的 OpenGL 简介(以及一般的现代图形编程,尽管 DX 方面的情况要好一些)更容易找到。
    • 这是一个非常有帮助的答案,但实际上我在考虑固定管道并意味着另一件事:你渲染一帧图像并只使用一个(点)光 - 你改变了这盏灯在单独的 cals 之间,所以看起来它不仅仅是一个灯,我在问它是否会工作,或者之前的灯位置可能会被取消,只有最后一个在发送所有帧时才重要
    • 很难回忆 FFP 的细节,但是在你渲染了一些东西之后,在你清除颜色缓冲区(屏幕)之前,结果不会消失,除非在它上面绘制了一些东西。所以它应该工作,我猜。多年前我在 delphy 上做了一些 FFP,Opengl FFP 在用户创建的循环中手动清理了 z-buffer 和 color-buffer。
    猜你喜欢
    • 2018-01-17
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多