c++ - OpenGL 对多个纹理感到困惑

标签 c++ opengl textures texture-mapping

我正在使用 OpenGL 3.3 开发 3d 程序。到目前为止,我设法渲染了许多立方体和一些球体。我需要用一个共同的纹理对所有立方体的所有面进行纹理处理,除了一个应该具有不同纹理的面。我尝试使用单一纹理,一切正常,但当我尝试添加另一个纹理时,程序似乎随机运行。
我的问题:
是否有合适的方法将多个纹理传递给着色器?
我应该如何跟踪面部以渲染正确的纹理?
谷歌搜索我发现将顶点定义两次可能很有用,但我真的不明白为什么。

最佳答案

Is there a suitable way of passing multiple textures to the shaders?

你会使用 glUniform1i()连同 glActiveTexture() .因此,假设您的片段着色器有多个 uniform sampler2D:

uniform sampler2D tex1;
uniform sampler2D tex2;

然后在设置着色器时,将采样器制服设置为您希望它们关联的纹理单元:

glUniform1i(glGetUniformLocation(program, "tex1"), 0)
glUniform1i(glGetUniformLocation(program, "tex2"), 1)

然后将事件纹理设置为 GL_TEXTURE0GL_TEXTURE1 并绑定(bind)一个纹理。

glActiveTexture(GL_TEXTURE0)
glBindTexture(GL_TEXTURE_2D, texture1)

glActiveTexture(GL_TEXTURE1)
glBindTexture(GL_TEXTURE_2D, texture2)

How am I supposed to keep track of faces in order to render the right texture?

这取决于你想要什么。

  • 您可以根据法线决定使用哪个纹理(通常使用三平面纹理映射完成)。
  • 您还可以使用另一个属性来决定两个纹理之间的交叉淡化程度。

    color = mix(texture(tex1, texCoord), texture(tex2, texCoord), 0.2)
    
  • 和以前一样,您同样可以有一个uniform float transition。这将允许您在纹理之间淡入淡出,可以说像在 PowerPoint 中一样在幻灯片之间淡入淡出。

尝试阅读 LearnOpenGL's Textures tutorial .

最后,至少有 80 个纹理单元。您可以使用 GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 检查具体有多少可用。

关于c++ - OpenGL 对多个纹理感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43592691/

相关文章:

swift - Metal 中的 ASTC 纹理压缩——我应该使用什么作为每行的字节数?

c++ - asp.net mvc(使用HRESULT的C++异常的外部dll:0x8007007E)

c++ - 我如何让 Anjuta 突出显示我的构建系统 (waf) 产生的错误/行?

c++ - 进行变换的最快方法(移动、旋转、缩放)

opencv - 如何使用cuda tex2D访问像素的每个 channel

html - Svg 不能用作背景

c++ - 通过 C++ 程序更改 shell 的目录

windows - 多窗口 OpenGL/Glut

opengl - 权限被拒绝在Linux上运行我自己的程序?

c++ - 使用计算着色器进行纹理贴图