首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >opengl中的多纹理加法混合

opengl中的多纹理加法混合
EN

Stack Overflow用户
提问于 2013-02-09 22:26:02
回答 1查看 937关注 0票数 0

我想要的效果,一个金属表面,有强烈的太阳反射,实际上变成白色的光。它很好地工作了两遍渲染和加法混合第二次通过(一个几乎白色的纹理和最高的投机性光)超过第一个(金属)。

但是,为了性能起见,我想切换到MultiTexturing,但是这里没有添加混合的东西,只是

代码语言:javascript
复制
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,  GL_BLEND);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

这些都不是添加剂的混合物。:-(

我的第二个问题:是否有可能使第二个纹理比同一三角形上的第一个纹理更闪亮?似乎使用glMaterial覆盖了另一种纹理的材料。

解决方案可能是一个很好的glTexEnvi -黑客,可以模拟纹理的效果,强烈的光泽?

EN

回答 1

Stack Overflow用户

发布于 2013-02-11 00:06:36

伙计们,我终于为此写了个着色器!奇怪的是,我最终没有使用加法混合(只需改变着色器中的一行来实现这一点),而是扩展了这个想法,使第二个纹理将是一个镜面地图-这样,它的纹理将被看到只有当镜面光击中它!

大多数效果可以通过这样一个事实来实现:我自己的着色器可以简单地处理的一个值,这个值比1高得多-邪恶的OpenGL会将它剪裁为1,而不需要问:-(

代码语言:javascript
复制
GLfloat mat_specular[] ={ 2, 2, 2, 1 }; glMaterialfv(GL_FRONT, GL_SPECULAR,mat_specular); //works here :-)

顶点着色器:

代码语言:javascript
复制
   vs = const_cast<char *>(
     "varying vec4 diffuse, ambient;"
     "varying vec3 normal, lightDir, halfVector;"
     "uniform float time;"
     "void main(void){"
       "normal = normalize(gl_NormalMatrix * gl_Normal);"  //Transform Normal into Eye Space
       "lightDir = normalize(vec3(gl_LightSource[0].position));"
       "halfVector = normalize(gl_LightSource[0].halfVector.xyz);"
       "diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse;"
       "ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient + gl_FrontMaterial.ambient * gl_LightModel.ambient;"
       "gl_TexCoord[0]  = gl_MultiTexCoord0;"
       "gl_Position = ftransform();"     //Apply Changes
     "}") ; 

碎片着色器:

代码语言:javascript
复制
fs =const_cast<char *>( 
  "uniform sampler2D tex1;"
  "uniform sampler2D tex2;"      
  "varying vec4 diffuse,ambient;"
  "varying vec3 normal, lightDir, halfVector;"
  "void main() {"
    "vec3 n,halfV,colortexel,colorfragment;"
    "vec4 texel,specularmap;"
    "float NdotL,NdotHV,alphatexel,alphafragment;\n"
    "colorfragment = ambient.rgb;"    //initialize color with ambient part
    "alphafragment = gl_FrontMaterial.diffuse.a;"
    "n = normalize(normal);"   //copy to write
    "NdotL = max(dot(normal, lightDir), -0.1);"
    "specularmap = texture2D(tex2,gl_TexCoord[0].st);"   //MUST Be started first!
    "texel = texture2D(tex1,gl_TexCoord[0].st*2.0);" 

    "if (NdotL>=-0.1) {"
        "colorfragment += diffuse.rgb * NdotL;"
        "halfV = normalize(halfVector);"
        "NdotHV = max (dot(n,halfV),0.0);"
        "colorfragment += gl_FrontMaterial.specular.rgb * specularmap.rgb * gl_LightSource[0].specular.rgb * pow(NdotHV, gl_FrontMaterial.shininess);"            
    "}"         

    "colortexel = texel.rgb; alphatexel = texel.a;"         
    "gl_FragColor = vec4(colortexel * colorfragment, alphatexel * alphafragment);"
    "}");

它一点也不优化,目前只是一个没有艺术技巧的概念的证明,但结果是:

渲染没有任何阴影,但多纹理“调制”。你可以在船上看到一些污垢,但镜面光线很差:

渲染与着色-污垢在那里,虽然不清楚地看到在这张照片。重镜面光,甚至可以通过提高glMaterialfv中的光谱值来增强:

以夸张的4倍的光泽呈现。你可以看到污垢的纹理现在在辉光中:

一个问题仍然-为什么我不能使用gl_TexCoord(1) -结果是没有纹理,但像素渲染工艺品,虽然多纹理工作良好,没有着色器。任何帮助都很感激。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14792309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档