游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5101|回复: 11

用Cg对任意形状的物体进行凹凸贴图

[复制链接]

73

主题

149

帖子

185

积分

注册会员

Rank: 2

积分
185
发表于 2005-9-26 12:46:00 | 显示全部楼层 |阅读模式
像3D中的人物和物体模型一般不是很规则的,一般由三角形网格组成。知道每个三角形三顶点的位置和纹理坐标,就可以计算出该三角形的TBN矩阵,然后将光向量转换到该三角形的切空间中,再计算diffuse和specular。用传统的API来实现Bumpmap有个缺点,就是要实现高specular比较困难,所以表面会较暗,没有光泽。而用shader就可以实现高specular,可以把specular指数提高数倍(我这里是8),从而表面有光泽,效果比较好。

这里我对一个四棱锥进行凹凸映射,可以实时改变其环境光ambient亮度和漫反射光的颜色。下面是截图:









程序和源码下载(需cg.dll和cgGL.dll支持):

cg_bumpmap.part1.rar
cg_bumpmap.part2.rar

欢迎交流:http://sm3d.126.com

38

主题

1581

帖子

1614

积分

金牌会员

Rank: 6Rank: 6

积分
1614
QQ
发表于 2005-9-27 10:59:00 | 显示全部楼层

Re:用Cg对任意形状的物体进行凹凸贴图

效果棒啊!

14

主题

45

帖子

45

积分

注册会员

Rank: 2

积分
45
发表于 2005-9-28 09:06:00 | 显示全部楼层

Re:用Cg对任意形状的物体进行凹凸贴图

靠,楼主好棒啊!佩服!

14

主题

45

帖子

45

积分

注册会员

Rank: 2

积分
45
发表于 2005-9-28 09:14:00 | 显示全部楼层

Re:用Cg对任意形状的物体进行凹凸贴图

原来没有源代码啊!楼主把源代码放出来大家学习一下吧!否则的话,看楼主的dot3 Bump还不如看玩Doom3去,里面全是这个。

18

主题

971

帖子

982

积分

高级会员

Rank: 4

积分
982
发表于 2005-9-28 18:07:00 | 显示全部楼层

Re:用Cg对任意形状的物体进行凹凸贴图

源代码看cg 编程那本书里有,相信楼主也是从哪弄的
另,用hlsl和glsl也有代码的,在nvidia网上就有,在gpu gems 2的源代码里面
dx的SDK里也有,nehe的教程里22课和32课都有...
偶知道,但都没看见,就保存着,10.1的时候再做做,这段时间写3D的算法,把API都忘光了,10.1要复习一下.

73

主题

149

帖子

185

积分

注册会员

Rank: 2

积分
185
 楼主| 发表于 2005-9-28 23:38:00 | 显示全部楼层

Re:用Cg对任意形状的物体进行凹凸贴图

我这几天在外地出差,十一回来后一定把源码放上来!

14

主题

45

帖子

45

积分

注册会员

Rank: 2

积分
45
发表于 2005-9-29 00:05:00 | 显示全部楼层

Re:用Cg对任意形状的物体进行凹凸贴图

那太好了,楼主好人啊!我读取了Doom3中的Md5模型文件,只是它的逐像素光照凹凸贴图我还不会,所以模型不太漂亮。

39

主题

102

帖子

102

积分

注册会员

Rank: 2

积分
102
发表于 2005-10-2 08:28:00 | 显示全部楼层

Re:用Cg对任意形状的物体进行凹凸贴图

对啊!哪里有源代码啊!期待

73

主题

149

帖子

185

积分

注册会员

Rank: 2

积分
185
 楼主| 发表于 2005-10-6 20:45:00 | 显示全部楼层

Re:用Cg对任意形状的物体进行凹凸贴图

源码已经包含在里面了,下载就是了。

36

主题

109

帖子

109

积分

注册会员

Rank: 2

积分
109
发表于 2005-10-8 10:40:00 | 显示全部楼层

Re:用Cg对任意形状的物体进行凹凸贴图

        glBegin(GL_TRIANGLE_FAN);
                // Set the texture coordinates for the rock texture and the normal map
                glMultiTexCoord2fARB(GL_TEXTURE0_ARB, g_vTexCoords[0][0].x, g_vTexCoords[0][0].y);

                // Specify the tangent matrix vectors, one by one, for the first triangle and send them to the vertex shader
                glMultiTexCoord3fARB(GL_TEXTURE1_ARB, g_TBNMatrix[0][0].x, g_TBNMatrix[0][0].y, g_TBNMatrix[0][0].z);
                glMultiTexCoord3fARB(GL_TEXTURE2_ARB, g_TBNMatrix[0][1].x, g_TBNMatrix[0][1].y, g_TBNMatrix[0][1].z);
                glMultiTexCoord3fARB(GL_TEXTURE3_ARB, g_TBNMatrix[0][2].x, g_TBNMatrix[0][2].y, g_TBNMatrix[0][2].z);

                // Draw the bottom left vertex
                glVertex3f(g_vQuad[0][0].x, g_vQuad[0][0].y, g_vQuad[0][0].z);

                // ------------------------------------------------------------ //

                // Set the texture coordinates for the rock texture and the normal map
                glMultiTexCoord2fARB(GL_TEXTURE0_ARB, g_vTexCoords[0][1].x, g_vTexCoords[0][1].y);

                // Draw the bottom right vertex
                glVertex3f(g_vQuad[0][1].x, g_vQuad[0][1].y, g_vQuad[0][1].z);

                // ------------------------------------------------------------ //

                // Set the texture coordinates for the rock texture and the normal map
                glMultiTexCoord2fARB(GL_TEXTURE0_ARB, g_vTexCoords[0][2].x, g_vTexCoords[0][2].y);

                // Draw the top right vertex
                glVertex3f(g_vQuad[0][2].x, g_vQuad[0][2].y, g_vQuad[0][2].z);

                // ------------------------------------------------------------ //

                // Set the texture coordinates for the rock texture and the normal map
                glMultiTexCoord2fARB(GL_TEXTURE0_ARB, g_vTexCoords[1][0].x, g_vTexCoords[1][0].y);

                // Specify the tangent matrix vectors, one by one, for the second triangle and send them to the vertex shader
                glMultiTexCoord3fARB(GL_TEXTURE1_ARB, g_TBNMatrix[1][0].x, g_TBNMatrix[1][0].y, g_TBNMatrix[1][0].z);
                glMultiTexCoord3fARB(GL_TEXTURE2_ARB, g_TBNMatrix[1][1].x, g_TBNMatrix[1][1].y, g_TBNMatrix[1][1].z);
                glMultiTexCoord3fARB(GL_TEXTURE3_ARB, g_TBNMatrix[1][2].x, g_TBNMatrix[1][2].y, g_TBNMatrix[1][2].z);

                // Draw the top left vertex
                glVertex3f(g_vQuad[1][0].x, g_vQuad[1][0].y, g_vQuad[1][0].z);
        glEnd();



--------------------
楼主的程序太好了,以前对BumpMap感到非常神秘,现在好点了(仍然迷糊)。

上面的代码为什么是在划三角形扇时第一个和第四个顶点用了三维坐标而中间的第二三个顶点不用呢?如果假如用D3D实现的话也会用到三维纹理吗?我对D3D不太熟悉。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-22 05:41

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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