1

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

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 替换它们。仍然希望我知道他在渲染时如何使用它们......

它应该是什么样子:

白天(少得多/几乎看不到光) 在此处输入图像描述

夜晚:

在此处输入图像描述

我的(使用上面的着色器代码): 在此处输入图像描述

看起来灯光要么太亮,要么它们对纹理的黑色贡献使它们难以看到。

4

0 回答 0