OpenGL ES 3D立方体单面贴双纹理时其余面显示异常问题求助
问题根因
你仅为立方体正面的4个顶点配置了纹理坐标,立方体剩余的5个面共20个顶点未配置有效纹理坐标,OpenGL绘制时会读取对应内存区域的脏数据作为纹理坐标进行采样,因此会出现异常纹理效果。你此前添加的GL_CLAMP_TO_EDGE配置仅能处理合法纹理坐标超出[0,1]范围时的采样逻辑,无法解决纹理坐标本身为无效脏值的问题。
可选用的解决方案
- 方案1:补全所有面的纹理坐标
为立方体剩余5个面的顶点补充纹理坐标,如果其他面不需要显示纹理,可以统一将非正面的纹理坐标设置为固定值(比如(0,0)),采样纹理对应位置的固定颜色即可,参考代码如下:private float textureCord[] = { // Front face 正面纹理坐标,保留原有配置 1.2f, 1.2f, 1.2f, -0.2f, -0.2f, -0.2f, -0.2f, 1.2f, // 背面纹理坐标 0f,0f, 0f,0f, 0f,0f, 0f,0f, // 左面纹理坐标 0f,0f, 0f,0f, 0f,0f, 0f,0f, // 右面纹理坐标 0f,0f, 0f,0f, 0f,0f, 0f,0f, // 顶面纹理坐标 0f,0f, 0f,0f, 0f,0f, 0f,0f, // 底面纹理坐标 0f,0f, 0f,0f, 0f,0f, 0f,0f }; - 方案2:着色器层面控制非正面不采样纹理
新增顶点属性标记是否为正面顶点,在片元着色器中判断,非正面直接输出固定纯色,不走纹理采样逻辑,参考代码如下:
顶点着色器:
片元着色器:attribute vec4 aPosition; attribute vec2 aTexCoord; attribute float aIsFront; varying vec2 vTexCoord; varying float vIsFront; uniform mat4 uMVPMatrix; void main() { gl_Position = uMVPMatrix * aPosition; vTexCoord = aTexCoord; vIsFront = aIsFront; }precision mediump float; varying vec2 vTexCoord; varying float vIsFront; uniform sampler2D uTexture1; uniform sampler2D uTexture2; void main() { if (vIsFront > 0.5) { // 此处保留原有正面双纹理叠加逻辑 vec4 color1 = texture2D(uTexture1, vTexCoord); vec4 color2 = texture2D(uTexture2, vTexCoord); gl_FragColor = mix(color1, color2, 0.5); } else { // 非正面直接输出指定纯色,可自行修改RGBA值 gl_FragColor = vec4(0.6f, 0.6f, 0.6f, 1.0f); } } - 方案3:分批次绘制立方体
先关闭纹理采样,绘制除正面之外的5个面输出纯色;再开启纹理采样,单独绘制正面并叠加双纹理效果,无需修改纹理坐标数组和着色器逻辑。
内容的提问来源于stack exchange,提问作者Bocho
相关产品推荐
相关产品推荐

