我正在编写一个支持加载旧游戏格式的客户端。它使用假照明,对于每个顶点,通常会提供一个顶点颜色。我使用以下方法使照明正确显示:
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;
这是一个例子:
现在,顶点颜色数据也有点奇怪。这是一个例子:
<-!-> 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 替换它们。仍然希望我知道他在渲染时如何使用它们......
它应该是什么样子:
白天(少得多/几乎看不到光)
夜晚:
我的(使用上面的着色器代码):
看起来灯光要么太亮,要么它们对纹理的黑色贡献使它们难以看到。