社区
游戏开发
帖子详情
一个距形的不同区域贴不同的纹理及一个距形的同一区域贴多重纹理如何实现
xqhrs232
2011-02-23 03:56:51
一个距形的不同区域贴不同的纹理及一个距形的同一区域贴多重纹理如何实现
...全文
119
10
打赏
收藏
一个距形的不同区域贴不同的纹理及一个距形的同一区域贴多重纹理如何实现
一个距形的不同区域贴不同的纹理及一个距形的同一区域贴多重纹理如何实现
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
xqhrs232
2011-02-24
打赏
举报
回复
使用GLBENDFUNC/GLALPHAFUNC函数就可以进行多层纹理在同一个区域的混合.
思月行云
2011-02-24
打赏
举报
回复
OpenGL不是很懂~
如果是DX我肯定首选Shader,用习惯了像素着色器再用固定流水线总觉得很烦琐……
gamemagic
2011-02-23
打赏
举报
回复
用着色器,真的很方便
xqhrs232
2011-02-23
打赏
举报
回复
看来得好好看看怎么BLEND什么的了
qthsrs232
2011-02-23
打赏
举报
回复
多重纹理贴图
http://blog.csdn.net/crazyjumper/archive/2007/06/25/1666207.aspx
[code=C]/C++
关于多重纹理:
首先如果一个显卡支持多重纹理,表示它可以将几次渲染合为一次来进行,在这个渲染过程中,你可以在不同的纹理单元分别放入第0次,第1次,第2次需要渲染的对象.当程序向屏幕绘图时,将这些渲染结果叠加起来,将最终结果显示到屏幕.
每个纹理单元对应有其纹理环境,这个纹理环境指明了渲染的纹理图片、渲染参数、过滤参数等等,其中有一个重要的项目指明了,程序在将渲染结果进行逐个叠加的过程中,当前的纹理单元内的内容如何与前面的内容进行混合.
这个些参数中包含了:
a . 要进行混合的纹理的来源
这个来源要分两步指定:
1. 对象来自哪个纹理单元[例如GL_TEXTURE0, GL_TEXTURE1],
2.该单元中的什么成分[例如:GL_SRC_COLOR,GL_ONE_MINUS_SRC_COLOR]
b. 混合所使用的函数
例如GL_ADD,GL_MODULATE,GL_INTERPLATE等
通俗一点来说呢, 如果我们要进行一次多重渲染就是要把两个纹理进行一次数学运算把得到的结果投放到屏幕。
当然这个数学运算是需要你自己指定的这包括运算类型,操作数来源,操作数的值, 就像下面这个简单的代数式一样:
C = A + B
要算出这个结果,那么我们首先要指定要进行什么运算(这里是+),然后指定这个运算的两个操作数(这里是a和b,对于渲染还要知道他们来自哪个纹理单元).
这些参数的指定都是通过用不同的参数来调用glTexEnv 完成的。然后我们就可以运算了。这个C就是我们渲染的最终结果。
具体来说:如果我们要进行一次多重渲染:
那么首先我们要在各个纹理单元里面放入不同的纹理图片
例如在第0号单元 放入texture[0]所对应的图片:
glActiveTextureARB( GL_TEXTURE0_ARB );
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, texture[0] );
例如在第1号单元 放入texture[1]所对应的图片:
glActiveTextureARB( GL_TEXTURE2_ARB );
glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, texture[1] );
然后 我们开始指定我们的代数运算:
首先告诉OpenGL 我们要把两个单元的纹理进行混合:
glTexEnvi( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_ARB );
然后告诉OpenGL我们要进行的运算:
glTexEnvi( GL_TEXTURE_ENV, GL_COMBINE_RGB_ARB, GL_INTERPOLATE_ARB );
这里 INTERPOLATE 是指线性插值,它的公式是这样的:
C = Arg0*Arg2 + Arg1*(1-Arg2);
翻译成代数的是这样:
C = a*ω + b*(1-ω) ; 这下大家可以清楚的看到它是一个线性插值表达式了吧
其中: Arg0 是第一个操作数,Arg1是第二个操作数,Arg2 是线性插值的系数就是那个ω了。
这些都要通过下面的函数调用来指定。当然,混合函数还可以是GL_ADD “加”,
GL_SUBTRACT “减”,GL_MODULATE “乘” 等等.
下面来说 Arg0,Arg1,Arg2 的指定:
前面提到过:要指定一个操作数,需要指定它来自于哪个纹理单元,和来自于该纹理单元的哪个部分:
所以我们在下面可以看到,指定一个Arg用了两句话,第一个指定了这个操作数的内容来自哪个纹理单元,第二个指定了来自于纹理单元里的哪个部分:
//前一个 这里指0号单元
glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE0_RGB_ARB, GL_PREVIOUS_ARB );
//0号单元中的COLOR部分即RGB
glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND0_RGB_ARB, GL_SRC_COLOR );
//这个GL_TEXTURE指当前活动的纹理单元也就是1号纹理单元
glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE1_RGB_ARB, GL_TEXTURE );
glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND1_RGB_ARB, GL_SRC_COLOR );
//由纹理环境变量GL_PRIMARY_COLOR_ARB指定的值
glTexEnvi( GL_TEXTURE_ENV, GL_SOURCE2_RGB_ARB, GL_PRIMARY_COLOR_ARB );
glTexEnvi( GL_TEXTURE_ENV, GL_OPERAND2_RGB_ARB, GL_SRC_COLOR );
有了他们 就完成了混合函数的指定了,下面要做的事就是给一个几何图像同时绑上不同的纹理让它们去按上面的公式混合吧 :
glBegin(GL_QUADS);
glNormal3f(0.0,0.0,1.0);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0.0,0.0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0.0,0.0);
glVertex3f(0.0f,0.0f,0.0f);
glNormal3f(0.0,0.0,1.0);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0.0,1.0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,0.0,1.0);
glVertex3f(0.0f,1.0f,0.0f);
glNormal3f(0.0,0.0,1.0);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0,1.0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1.0,1.0);
glVertex3f(1.0f,1.0f,0.0f);
glNormal3f(0.0,0.0,1.0);
glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0,0.0);
glMultiTexCoord2fARB(GL_TEXTURE1_ARB,1.0,0.0);
glVertex3f(1.0f,0.0f,0.0f);
glEnd();
上面是我的理解,不一定准确呵呵 不要深究哦.不过我想基本的步骤是说得比较清了. 欢迎联系偶......
======================== 提供一些直观的对比 =====================================
float arr0[4] = {g_T0Blend, g_T0Blend, g_T0Blend, g_T0Blend};
float arr1[4] = {g_T1Blend, g_T1Blend, g_T1Blend, g_T1Blend};
float arr2[4] = {g_T2Blend, g_T2Blend, g_T2Blend, g_T2Blend};
如果:
g_T0Blend = 0.5f
g_T1Blend = 0.25f
g_T2Blend = 0.25f
rn 为混合器n 的返回值
tn 为第n单元的纹理值
//Texture0
glActiveTextureARB(GL_TEXTURE0_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tobjects[TO_EARTH1]);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_CONSTANT);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, arr0);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
以上为纹理单元0 所作的操作,其公式是:
r0 = 0.5*t0
//Texture1
glActiveTextureARB(GL_TEXTURE1_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tobjects[TO_EARTH1]);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_CONSTANT);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_COLOR);
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, arr1);
对应的公式是
r1 = (0.25*t1) + ((1-0.25)*r0) = 0.25*t1 + 0.375*t0
//Texture2
glActiveTextureARB(GL_TEXTURE2_ARB);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, tobjects[TO_EARTH2]);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE0_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE1_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_SOURCE2_RGB, GL_CONSTANT);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_COLOR);
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, arr2);
对应的公式是:
r2 = (0.25*t2) + ((1-0.25)*r1) = 0.25*t2 + 0.1875*t1 + 0.2813*t0
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/crazyjumper/archive/2007/06/25/1666207.aspx
[/code]
qthsrs232
2011-02-23
打赏
举报
回复
OpenGL多重纹理使用与理解
http://www.cnitblog.com/linghuye/archive/2005/08/13/1856.html
OpenGL多重纹理
http://hi.baidu.com/%B9%C2%D6%DB%B5%F6%BF%CD/blog/item/c1a6c07c636df00628388aa2.html
qthsrs232
2011-02-23
打赏
举报
回复
一个距形的不同区域贴不同的纹理----很好实现-----网上的立方体例子可以参考
xqhrs232
2011-02-23
打赏
举报
回复
一个距形的同一区域贴多重纹理很多时候要求进行BLEND,很多时候要求图片进行了特别的处理,要不然前面的图会被后面的图直接盖住了。
xqhrs232
2011-02-23
打赏
举报
回复
glBindTexture的某一个时刻可以绑定多少个纹理?多个纹理我怎么一一指定贴那一个纹理?
一个距形的不同区域贴同一的纹理是没有问题的。但如何做到一个距形的不同区域贴不同的纹理,如何一一指定不同的纹理贴到不同的坐标?
xqhrs232
2011-02-23
打赏
举报
回复
GL_TEXTUREXX系列常量表示的是多个纹理还是多层/多重纹理的意思?
Threejs
多重
纹理
与过程
纹理
实现
Threejs
多重
纹理
与过程
纹理
实现
Threejs
多重
纹理
与过程
纹理
实现
具体
实现
核心代码 Threejs
多重
纹理
与过程
纹理
实现
多数时候
同一
图元是采用单一
纹理
,但是为了增强显示效果,会存在
同一
图元多个
纹理
图的情况,效果比如...
threejs
纹理
流动_Threejs
多重
纹理
与过程
纹理
实现
Author--------------- Yen多数时候
同一
...这样就为图案的显隐更加增添一丝神秘气息,效果如下:1)对
同一
个图元采用多幅
纹理
图,这种技术称为
多重
纹理
。2)在
多重
纹理
变化的边界根据某种规则进行平滑过渡效果,这种...
纹理
贴
图原理与实践【图形学基础】
纹理
贴
图是 20世纪90 年代 CG 的主要创新之一。它允许我们在不添加大量几何基元(线、顶点、面)的情况下添加大量表面细节。想一想 Caroline 的 loadedDemo 的所有
纹理
映射是多么有趣:推荐:使用快速搭建 3D场景。
Shader中
贴
图知识汇总: 漫反射
贴
图、凹凸
贴
图、高光
贴
图、 AO
贴
图、环境
贴
图、 光照
纹理
及细节
贴
图...
一个
三维场景的画面的好坏,百分之四十取决于模型,百分之六十取决于
贴
图,可见
贴
图在画面中所占的重要性。在这里我将列举一系列
贴
图,并且初步阐述其概念,理解原理的基础上制作
贴
图,也就顺手多了。 01漫反射
贴
图...
OpenGL
纹理
创建n个
纹理
id void glBindTexture(GLenum target, GLuint id); 把指定
纹理
对象与当前启用的
纹理
单元以target的形式进行绑定 target为 GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D。。。 例如要把当前的GL_...
游戏开发
8,304
社区成员
23,682
社区内容
发帖
与我相关
我的任务
游戏开发
游戏开发相关内容讨论专区
复制链接
扫一扫
分享
社区描述
游戏开发相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章