最近在学习GLSL,看了黄宝书之后,更是有点云里雾里,求大牛指导、1. 在内置变量里的 gl_MultiTexCoord0 和 gl_TexCoord[0]有什么区别?在外部使用纹理调用之后,shader里面是这两者是怎么个关系?如果使用的多重纹理,该怎么区分呢,仅仅只是gl_MultiTexCoord0 和 gl_MultiTexCoord1 的差别么?2. texture2D()函数的第一个变量 sampler2D 到底有什么用,为什么非得从外部调用?如果有多重纹理,
不管sampler2D是什么,调用的,岂不都是同一个纹理的坐标?该如何区分呢?3. 在使用FBO的时候,基本都是使用先渲染到自己制定的缓冲,而不是直接显示在屏幕上的用法,那么我在绑定的时候,
例如:
glGenTextures(1, &g_FBOTexNormal);
glBindTexture(GL_TEXTURE_2D, g_FBOTexNormal);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glBindTexture(GL_TEXTURE_2D, 0);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_2D, g_FBOTexNormal, 0);glGenTextures(1, &g_FBOTexDepth);
glBindTexture(GL_TEXTURE_2D, g_FBOTexDepth);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT24, w, h, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, NULL);
glBindTexture(GL_TEXTURE_2D, 0);
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_TEXTURE_2D, g_FBOTexDepth, 0);
并绑定到FBO之后, 数据到哪里去了?4. 当我使用了以上函数又在再加上glDrawbuffer() 之后 在frag shader里使用gl_FragData[0],gl_FragData[1]赋值的时候
这些数据都跑到哪个纹理了? 是gl_MultiTexCoord0 还是 gl_TexCoord[0] 还是别的地方?我再想在shader里调用这些纹理数据的时候,该怎么调用?还是用texture2D()函数么?网上讲的都不清不楚的,求大牛指导~~谢谢

解决方案 »

  1.   

    补充一个问题恩,FBO中处理深度和纹理采用的是不一样的办法,一个是GL_DEPTH_ATTACHMENT_EXT, 另一个是GL_COLOR_ATTACHMENT0_EXT, 这两者有什么区别么,为什么其中一个需要自己建立纹理左边,比如glGenTextures(1, &color_tex);
      glBindTexture(GL_TEXTURE_2D, color_tex);
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
      glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
      //NULL means reserve texture memory, but texels are undefined
      glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 256, 256, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL);
    而深度缓存却不需要,深度的数据跑到哪里去了呢?