OpenGL / GLSL - 处理旧游戏中的光照(混合环境光和顶点颜色)

时间:2012-08-10 02:33:08

标签: opengl glsl game-engine lighting

我正在编写一个支持加载旧游戏格式的客户端。它使用假照明,对于每个顶点,通常提供顶点颜色。我通过使用以下方式使灯光正确显示:

vec4 textureColor = texture2D(texture, outtexture) * vertexColor;

问题在于,对于RGB提供的顶点为0.0,0.0,0.0,整个纹理当然是黑色的。我一直在玩几种不同的算法,但纹理看起来仍然有点暗,或者灯光太亮了。

以下是着色器:

float ambient = 1.0;

vec4 textureColor = texture2D(texture, outtexture);
vec4 lighting = vec4((vertexColor * vertexColor.a) + (ambient * textureColor));

gl_FragColor = textureColor * lighting;

以下是一个例子:

Textures with no light are too dark

现在,顶点颜色数据也有点奇怪。这是一个例子:

<-!-> R: 0.000000, G: 0.000000, B: 0.000000, A: 0.000000
<-!-> R: 0.000000, G: 0.000000, B: 0.000000, A: 0.000000
<-!-> R: 0.000000, G: 0.000000, B: 0.000000, A: 0.000000
<-!-> R: 0.023529, G: 0.023529, B: 0.003922, A: 0.858824
<-!-> R: 0.007843, G: 0.007843, B: 0.000000, A: 0.850980
<-!-> R: 0.007843, G: 0.007843, B: 0.000000, A: 0.858824
<-!-> R: 0.023529, G: 0.023529, B: 0.003922, A: 0.858824
<-!-> R: 0.050980, G: 0.050980, B: 0.011765, A: 0.882353
<-!-> R: 0.078431, G: 0.078431, B: 0.015686, A: 0.858824
<-!-> R: 0.078431, G: 0.078431, B: 0.015686, A: 0.858824
<-!-> R: 0.050980, G: 0.050980, B: 0.011765, A: 0.894118
<-!-> R: 0.031373, G: 0.031373, B: 0.007843, A: 0.862745
<-!-> R: 0.050980, G: 0.050980, B: 0.011765, A: 0.882353
<-!-> R: 0.050980, G: 0.050980, B: 0.011765, A: 0.894118
<-!-> R: 0.031373, G: 0.031373, B: 0.007843, A: 0.858824
<-!-> R: 0.000000, G: 0.000000, B: 0.000000, A: 0.858824
<-!-> R: 0.000000, G: 0.000000, B: 0.000000, A: 0.835294

请注意,它包含一些正常值(0,0,0,0)和一些带有十进制数的常规值以及0,0,0的值,然后定义了alpha。

如果您已经看过这种方法,或者对如何实现正常外观渲染有任何建议,请随意加入。是的,我意识到这个问题有点不同,但希望有人应该有一些见解。

编辑:如果这有帮助,我的一个朋友有一个类似的项目。这就是他如何加载信息并将其打包为DirectX:

     int iBlue  = GetByte( );
     int iGreen = GetByte( );
     int iRed   = GetByte( );
     int iAmb   = GetByte( );

     pVertex->m_dwDiffuse = D3DCOLOR_ARGB( (BYTE)( max( iAmb,     1 ) ), 
                                           (BYTE)( max( iRed,     1 ) ), 
                                           (BYTE)( max( iGreen,   1 ) ),
                                           (BYTE)( max( iBlue,    1 ) ) );

我假设他完全按照我的方式进行操作并将字节转换为整数,然后如果它们是负数,则将其替换为1.仍然希望我知道他在渲染时如何使用它们...

它应该是什么样的:

日(更少/几乎没有看到光) enter image description here

夜:

enter image description here

我的(使用上面的着色器代码): enter image description here

看起来灯光太亮或者它们对纹理的黑色贡献太难看了。

0 个答案:

没有答案