Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenGL混淆了多重纹理_C++_Opengl_Textures_Texture Mapping - Fatal编程技术网

C++ OpenGL混淆了多重纹理

C++ OpenGL混淆了多重纹理,c++,opengl,textures,texture-mapping,C++,Opengl,Textures,Texture Mapping,我正在用OpenGL 3.3开发一个3d程序。到目前为止,我设法渲染了许多立方体和一些球体。我需要纹理所有立方体的所有面都有一个共同的纹理,除了一个面应该有不同的纹理。我尝试使用一种纹理,但当我尝试添加另一种纹理时,程序的行为似乎是随机的。 我的问题: 是否有合适的方法将多个纹理传递给着色器? 如何跟踪面以渲染正确的纹理? 通过谷歌搜索,我发现定义两次顶点可能很有用,但我真的不明白为什么。可以使用索引缓冲区。定义一次顶点,然后使用一个索引缓冲区绘制具有第一个纹理的网格部分,然后使用第二个索引缓冲

我正在用OpenGL 3.3开发一个3d程序。到目前为止,我设法渲染了许多立方体和一些球体。我需要纹理所有立方体的所有面都有一个共同的纹理,除了一个面应该有不同的纹理。我尝试使用一种纹理,但当我尝试添加另一种纹理时,程序的行为似乎是随机的。
我的问题:
是否有合适的方法将多个纹理传递给着色器?
如何跟踪面以渲染正确的纹理?

通过谷歌搜索,我发现定义两次顶点可能很有用,但我真的不明白为什么。

可以使用索引缓冲区。定义一次顶点,然后使用一个索引缓冲区绘制具有第一个纹理的网格部分,然后使用第二个索引缓冲区绘制需要第二个纹理的部分

以下是一般公式:

  • 设置顶点缓冲区
  • 设置着色器
  • 设置第一个纹理
  • 为应使用第一个纹理的网格部分设置并绘制索引缓冲区
  • 设置第二个纹理
  • 为应使用第二个纹理的网格部分设置并绘制索引缓冲区

  • 您可以使用索引缓冲区。定义一次顶点,然后使用一个索引缓冲区绘制具有第一个纹理的网格部分,然后使用第二个索引缓冲区绘制需要第二个纹理的部分

    以下是一般公式:

  • 设置顶点缓冲区
  • 设置着色器
  • 设置第一个纹理
  • 为应使用第一个纹理的网格部分设置并绘制索引缓冲区
  • 设置第二个纹理
  • 为应使用第二个纹理的网格部分设置并绘制索引缓冲区
  • 是否有合适的方法将多个纹理传递给着色器

    你会和我一起使用。因此,给定片段着色器具有多个
    统一采样器2D

    uniform sampler2D tex1;
    uniform sampler2D tex2;
    
    然后,在设置着色器时,将采样器制服设置为要与之关联的纹理单位:

    glUniform1i(glGetUniformLocation(program, "tex1"), 0)
    glUniform1i(glGetUniformLocation(program, "tex2"), 1)
    
    然后将活动纹理设置为
    GL_TEXTURE0
    GL_TEXTURE1
    并绑定纹理

    glActiveTexture(GL_TEXTURE0)
    glBindTexture(GL_TEXTURE_2D, texture1)
    
    glActiveTexture(GL_TEXTURE1)
    glBindTexture(GL_TEXTURE_2D, texture2)
    
    为了渲染正确的纹理,我应该如何跟踪面

    这取决于你想要什么

    • 您可以根据法线决定使用哪个纹理(通常使用三平面纹理贴图)
    • 您还可以使用另一个属性来决定两个纹理之间的交叉淡入度

      color = mix(texture(tex1, texCoord), texture(tex2, texCoord), 0.2)
      
    • 像以前一样,您可以同样地进行
      均匀浮点转换
      。这将允许您在纹理之间淡入淡出,从而可以像在PowerPoint中一样在幻灯片之间淡入淡出

    试着阅读

    最后,至少有80个纹理单元。您可以使用
    GL\u MAX\u COMBINED\u TEXTURE\u IMAGE\u UNITS
    具体检查可用的数量

    是否有合适的方法将多个纹理传递给着色器

    你会和我一起使用。因此,给定片段着色器具有多个
    统一采样器2D

    uniform sampler2D tex1;
    uniform sampler2D tex2;
    
    然后,在设置着色器时,将采样器制服设置为要与之关联的纹理单位:

    glUniform1i(glGetUniformLocation(program, "tex1"), 0)
    glUniform1i(glGetUniformLocation(program, "tex2"), 1)
    
    然后将活动纹理设置为
    GL_TEXTURE0
    GL_TEXTURE1
    并绑定纹理

    glActiveTexture(GL_TEXTURE0)
    glBindTexture(GL_TEXTURE_2D, texture1)
    
    glActiveTexture(GL_TEXTURE1)
    glBindTexture(GL_TEXTURE_2D, texture2)
    
    为了渲染正确的纹理,我应该如何跟踪面

    这取决于你想要什么

    • 您可以根据法线决定使用哪个纹理(通常使用三平面纹理贴图)
    • 您还可以使用另一个属性来决定两个纹理之间的交叉淡入度

      color = mix(texture(tex1, texCoord), texture(tex2, texCoord), 0.2)
      
    • 像以前一样,您可以同样地进行
      均匀浮点转换
      。这将允许您在纹理之间淡入淡出,从而可以像在PowerPoint中一样在幻灯片之间淡入淡出

    试着阅读

    最后,至少有80个纹理单元。您可以使用
    GL\u MAX\u COMBINED\u TEXTURE\u IMAGE\u UNITS

    具体检查您有多少可用的单元。此外,您应该检查哪些单元更适合回答这些类型的问题。此外,您还应该检查哪些单元更适合回答这些类型的问题。