这听起来像是一个奇怪的问题,但这是故事:
有一个小而固执的社区,仍然玩着较旧的2005-6游戏(帝国时代III +扩展版)。有些人在Windows上玩,有些人在OS X上玩(游戏也移植到OS X上)。
问题是,当游戏在OS X上启动时,每个人都可以在中高级着色器设置上玩,这时似乎可以正确识别图形卡。但是,一旦较新的型号安装了Intel图形芯片(Intel HD 4000,Iris等),中型和更高级别的着色器设置就会停止工作。
现在,同一游戏可以在Windows上正确显示中高着色器,但在同一台计算机上的OS X中却不能这样做(使用双引导)。因此,这不是硬件问题。同一图形芯片可以在Windows(在DirectX环境中)上显示高着色器,但在OS X(在OpenGL环境中)上不能显示高着色器。
首先,我认为这是因为移植此游戏的公司(Macsoft)并未将着色器编程用于OpenGL,但显然可以。由于高级着色器曾经在OS X中工作过,因此这意味着他们的OpenGL适配可以在不同的硬件上正常工作。因此,似乎游戏开发商如何编写配置文件以识别硬件设备,以某种方式不能将较新的英特尔图形芯片识别为具有DirectX 8/9 Shader模型v 2.0功能以及将默认设置呈现为基本DirectX 7功能存在问题没有任何着色器。
我对游戏文件进行了一些研究,以试图找出使游戏能够识别图形芯片的文件,然后从该文件夹中找到了devices.xml(我将所有着色器文件都上传到googledrive中,以防万一。任何人都想看一下):
我发现游戏会忽略devices.xml文件中的所有内容,并跳转到着色器设置最低的最后一个通用设备:
<device name="GenericFF">
generic dx7
<low>Generic DX7</low>
</device>
如果我用通用DX8设置替换了此设备,游戏将开始显示更多的着色器,但是水渲染会出现一些奇怪的颜色范围,从绿色到紫色。
该通用DX7配置文件也被编码在一个名为通用DX7.d3dconfig的单独文件中,您可以在前面提到的相同的/ Config /文件夹中找到该文件。在此文件中,您可以找到许多设置,例如:
<d3dconfig>
<fixedfunctionverts>true</fixedfunctionverts>
<techniques>
<enable>alpha transparency</enable>
<enable>alphatest</enable>
<enable>alphatest_flatcolor</enable>
<enable>alphatest_blendcolor</enable>
这些着色器功能均具有自己的设置文件,例如alphatest(在/ techniques /文件夹中):
<technique>
<pass>
<texture stage="0">diffuse</texture>
<rs>alphatest</rs>
<tss>default</tss>
</pass>
</technique>
而且,当然,最终所有这些以与XML类似的格式编码的配置文件都指向着色器编程文件,例如/ Render / ps /文件夹中的default_shader.psh:
ps.1.1
def c7, 1, 0, 0, 0
tex t0 //base texture
#ifdef ENVMAP
tex t2 //envmap texture
#endif
mul_x2 r0.rgb, t0, v0 // texture * light
+mul r0.a, t0, v0 // texture * light
#ifdef ENVMAP
// reflectivity is a float value in the r component so the dp3 is a
// clunky way to propogate this value into all components before the lerp
dp3 r1, c6, c7
lrp r0, r1, t2, r0
#endif
#ifdef TREE
add r0, r0, c1
#endif
#ifdef TINT
add r0, r0, c0
#endif
问题是:是否可以使这个旧游戏(使用较旧的着色器编程,最多支持Shader model 2.0)识别较新的Intel图形芯片,或者这是OS X上的游戏如何移植到OpenGL的问题?环境?
更新:
还有另一个似乎未被游戏使用的文件夹,其中一个与我上面提到的名称相同的文件具有以下代码:
// default_shader.psh
#ifdef TREE
uniform vec4 pc1;
#endif
#ifdef TINT
uniform vec4 pc0;
#endif
uniform sampler2D tx0;
void main()
{
vec4 diffuse = vec4( texture2D(tx0, gl_TexCoord[0].st) ) * gl_Color;
diffuse.xyz *= 2.0;
#ifdef TREE
diffuse += pc1;
#endif
#ifdef TINT
diffuse += pc0;
#endif
gl_FragColor = diffuse;
}
/*
ps.1.1
def c7, 1, 0, 0, 0
tex t0 //base texture
#ifdef ENVMAP
tex t2 //envmap texture
#endif
mul_x2 r0.rgb, t0, v0 // texture * light
+mul r0.a, t0, v0 // texture * light
#ifdef ENVMAP
// reflectivity is a float value in the r component so the dp3 is a
// clunky way to propogate this value into all components before the lerp
dp3 r1, c6, c7
lrp r0, r1, t2, r0
#endif
#ifdef TREE
add r0, r0, c1
#endif
#ifdef TINT
add r0, r0, c0
#endif
*/
我的结论是,这很可能是不可能的,因为OpenGL移植的很大一部分涉及针对每个专有设备的单独的着色器编程。
例如,在/ shaders /文件夹中,每个主要制造商都有单独的用于地形阴影渲染的文件,这些文件为运行OS X(ATI和nVidia)的计算机提供了图形卡:地形阴影only_ati.vsh和地形阴影only_nv.psh。这些具有用于渲染同一事物的不同方法:
// terrain shadow only_ati.vsh
uniform mat4 vc0; // worldViewProj
uniform mat4 vc4;
uniform mat4 vc8;
uniform vec4 vc12;
void main()
{
// transform position
gl_Position = gl_Vertex * vc0;
// Set to constant color
gl_FrontColor = vec4(0.0);
// transform
gl_TexCoord[0] = gl_Vertex * vc4;
// Depth in light space
vec4 r1 = gl_Vertex * vc8;
gl_TexCoord[1].s = r1.z * vc12.x;
}
和
// terrain shadow only_nv.vsh
uniform mat4 vc0; // worldViewProj
uniform mat4 vc4;
uniform vec4 vc15; // texture filtering offsets
uniform vec4 vc16;
uniform vec4 vc17;
void main()
{
// transform position
gl_Position = gl_Vertex * vc0;
// Set to constant color
gl_FrontColor = vec4(0.0, 0.0, 0.0, 0.0);
// transform
vec4 r0 = gl_Vertex * vc4;
r0.y = 1.0 - r0.y; // Invert y (reading from a GL buffer)
//-- compute PCF Filter texture offsets
gl_TexCoord[0] = r0 + vc15;
gl_TexCoord[2] = r0 + vc16;
gl_TexCoord[3] = r0 + vc17;
}
由于没有针对英特尔芯片的OpenGL移植,这意味着该游戏的OpenGL部分可能不支持中等和更高阴影的支持。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句