游戏开发论坛

 找回密码
 立即注册
搜索
查看: 2403|回复: 7

谁帮我把这段OpenGL代码转换为相应的D3D代码?

[复制链接]

30

主题

90

帖子

94

积分

注册会员

Rank: 2

积分
94
发表于 2004-11-4 17:49:00 | 显示全部楼层 |阅读模式
下面这一段代码是OpenGL设置MultiTexture的,是关于地形的多层纹理混合的。共有Tile1、Tile2、Tile3三张地表贴图、和一张Lightmap贴图(应该对应D3D中的4个TextureStage)。除此之外,还用到一个m_ColorPool,这个ColorPool里面,据说是存放的Tile1、Tile2、Tile3的混合因子。难不成把3张贴图的混合因子存在一个缓冲区里了?其实从代码看,应该这样理解:ColorPool相当于一个ARGB的纹理,Tile1和Tile2之间使用ColorPool的颜色分量作为混合因子,混合出来的结果再跟Tile3以ColorPool的Alpha分量为混合因子进行混合,这次混合出的结果跟Lightmap以Modulate的方式混合,完成渲染。
问题是,Tile1和Tile2之间的混合是用ColorPool的Color分量(RGB)作为混合因子的,这在D3D的TextureStage里面似乎只有D3DTOP_LERP这个方法与之对应,但我的显卡并不支持这个ColorOP,但是下面的OpenGL程序却可以运行。而且Slerp需要3个Args,而不是2个。
所以我想问一下,下面的OpenGL程序如果用D3D来写,应该是怎样的?[em4]

        glEnableClientState(GL_COLOR_ARRAY);
        glColorPointer(4, GL_FLOAT, 0, &m_ColorPool[0]);

        glClientActiveTextureARB(GL_TEXTURE3_ARB);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        glTexCoordPointer(2, GL_FLOAT, 0, &m_LightPool[0]);

        glClientActiveTextureARB(GL_TEXTURE2_ARB);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        glTexCoordPointer(2, GL_FLOAT, 0, &m_TexturePool[0]);

        glClientActiveTextureARB(GL_TEXTURE1_ARB);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        glTexCoordPointer(2, GL_FLOAT, 0, &m_TexturePool[0]);

        glClientActiveTextureARB(GL_TEXTURE0_ARB);
        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        glTexCoordPointer(2, GL_FLOAT, 0, &m_TexturePool[0]);

        glEnableClientState(GL_VERTEX_ARRAY);
        glVertexPointer(3, GL_FLOAT, 0, &m_VertexPool[0]);

        // Texture 3: previous * Lightmap
        glActiveTextureARB(GL_TEXTURE3_ARB);
        glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, m_lightmap.ID());
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

        // Texture 2: lerp(ColorPool.alpha, previous, tile3)
        glActiveTextureARB(GL_TEXTURE2_ARB);
        glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, m_tile3.ID());

        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
        glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_INTERPOLATE_ARB);

        glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS_ARB);
        glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);

        glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE);
        glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);

        glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_PRIMARY_COLOR_ARB);
        glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_ALPHA);

        // Texture 1: lerp(ColorPool.rgb, tile1, tile2)
        glActiveTextureARB(GL_TEXTURE1_ARB);
        glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, m_tile2.ID());

        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB);
        glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_INTERPOLATE_ARB);

        glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS_ARB);
        glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR);

        glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE);
        glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR);

        glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_PRIMARY_COLOR_ARB);
        glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_COLOR);

        // Texture 0: tile1
        glActiveTextureARB(GL_TEXTURE0_ARB);
        glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, m_tile1.ID());
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

3

主题

95

帖子

107

积分

注册会员

Rank: 2

积分
107
发表于 2004-11-4 20:03:00 | 显示全部楼层

Re:谁帮我把这段OpenGL代码转换为相应的D3D代码?

哥们,代码太长了,看了都不想帮你翻译了……

30

主题

90

帖子

94

积分

注册会员

Rank: 2

积分
94
 楼主| 发表于 2004-11-5 12:24:00 | 显示全部楼层

Re: Re:谁帮我把这段OpenGL代码转换为相应的D3D代码?

lyzcom: Re:谁帮我把这段OpenGL代码转换为相应的D3D代码?

哥们,代码太长了,看了都不想帮你翻译了……

伪代码啊。大哥,小弟给您跪下了!!
ColorPool是一个浮点型的缓冲区,里面每4个浮点数表示一个RGBA颜色。
我的理解就是OpenGL可以直接接受这样一个缓冲区用作贴图,不像D3D把图像数据封装在IDirect3DTexture里面。然后,GL_INTERPOLATE_ARB这个方法,类似于D3D Texture Stage里面的ColorOP,它的算法是:Arg1*Arg3 + Arg2 * (1-Arg3)。注意这里的混合因子是Arg3,而Arg3是与Arg1和Arg2地位等同的,不一定是Alpha值,也可以是颜色值。D3D与这个算法相对应的有一个D3DTOP_LERP。那么Arg3可能就是D3D的D3DTSS_COLORARG0或Alpha0。但是怎么设置它,让它接受ColorPool这样的缓冲呢?

8

主题

65

帖子

71

积分

注册会员

Rank: 2

积分
71
发表于 2004-11-5 22:23:00 | 显示全部楼层

Re:谁帮我把这段OpenGL代码转换为相应的D3D代码?

up

11

主题

136

帖子

142

积分

注册会员

Rank: 2

积分
142
QQ
发表于 2004-11-5 22:48:00 | 显示全部楼层

Re:谁帮我把这段OpenGL代码转换为相应的D3D代码?

再来水一贴!
我是新人请愿谅

11

主题

136

帖子

142

积分

注册会员

Rank: 2

积分
142
QQ
发表于 2004-11-5 22:49:00 | 显示全部楼层

Re:谁帮我把这段OpenGL代码转换为相应的D3D代码?

这一水不得了了,水成战士了!

18

主题

579

帖子

583

积分

高级会员

Rank: 4

积分
583
发表于 2004-11-6 16:46:00 | 显示全部楼层

Re:谁帮我把这段OpenGL代码转换为相应的D3D代码?

不仅是为代码,还用了不少扩展,翻译的时候还要来段Shader.....

8

主题

65

帖子

71

积分

注册会员

Rank: 2

积分
71
发表于 2004-11-7 22:11:00 | 显示全部楼层

Re:谁帮我把这段OpenGL代码转换为相应的D3D代码?

up
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-23 03:57

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表