我正在编写一个支持加载旧游戏格式的客户端。它使用假照明,对于每个顶点,通常提供顶点颜色。我通过使用以下方式使灯光正确显示:
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.仍然希望我知道他在渲染时如何使用它们...
它应该是什么样的:
日(更少/几乎没有看到光)
夜:
我的(使用上面的着色器代码):
看起来灯光太亮或者它们对纹理的黑色贡献太难看了。