You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

OpenGL片段着色器:长方体部分面纹理、部分面着色实现问询

解决方案:给目标顶点添加纹理启用标记属性

刚好之前做一个小Demo的时候遇到过几乎一样的需求,用单个片段着色器完全能搞定,核心思路就是给需要贴纹理的12个顶点加个专属标记,然后在着色器里根据这个标记走不同的着色逻辑就行。下面一步步给你拆解:

1. 在程序端给顶点数据添加标记属性

首先,你需要在你的顶点结构体里新增一个浮点型(或布尔型)的属性,用来标记这个顶点是否需要使用纹理。比如我们叫它useTexture:

// 示例顶点结构体(用GLM举例,你可以换成自己的向量类型)
struct Vertex {
    glm::vec3 position;   // 顶点位置
    glm::vec3 color;      // 纯色填充的颜色
    glm::vec2 texCoord;   // 纹理坐标(不需要纹理的顶点可以填(0,0)这类默认值)
    float useTexture;     // 标记:1.0 = 使用纹理,0.0 = 使用纯色
};

然后给那12个需要贴纹理的顶点把useTexture设为1.0,剩下的顶点设为0.0。

2. 顶点着色器传递标记到片段着色器

在顶点着色器里,我们需要把这个标记作为输出变量传递给片段着色器,同时也要传递纹理坐标和纯色信息:

#version 330 core
layout (location = 0) in vec3 a_Position;
layout (location = 1) in vec3 a_Color;
layout (location = 2) in vec2 a_TexCoord;
layout (location = 3) in float a_UseTexture;

// 传递给片段着色器的变量
out vec3 v_Color;
out vec2 v_TexCoord;
out float v_UseTexture;

uniform mat4 u_ModelViewProjection; // MVP矩阵

void main() {
    gl_Position = u_ModelViewProjection * vec4(a_Position, 1.0);
    v_Color = a_Color;
    v_TexCoord = a_TexCoord;
    v_UseTexture = a_UseTexture;
}

3. 片段着色器根据标记分支处理

到了片段着色器,我们只需要根据传递过来的标记,判断是采样纹理还是输出纯色即可:

#version 330 core
out vec4 FragColor;

in vec3 v_Color;
in vec2 v_TexCoord;
in float v_UseTexture;

uniform sampler2D u_Texture; // 你的纹理采样器

void main() {
    // 用>0.5判断是因为浮点型可能有精度误差,避免误判
    if (v_UseTexture > 0.5) {
        FragColor = texture(u_Texture, v_TexCoord);
    } else {
        FragColor = vec4(v_Color, 1.0);
    }
}

4. 可选优化:用mix函数替代条件分支

如果你担心条件分支会影响性能(其实这种简单分支GPU会做分支预测,性能影响可以忽略),可以用GLSL的mix函数来实现无分支的混合,代码更简洁:

void main() {
    vec4 texColor = texture(u_Texture, v_TexCoord);
    vec4 solidColor = vec4(v_Color, 1.0);
    // mix(a,b,x) = a*(1-x) + b*x,x=1时取b,x=0时取a
    FragColor = mix(solidColor, texColor, v_UseTexture);
}

注意事项

  • 不需要纹理的顶点,纹理坐标可以随便填(比如(0,0)),反正不会被采样到;
  • 绑定顶点缓冲区时,要确保正确设置这个useTexture属性的步长(stride)和偏移量(offset),不要漏传这个属性;
  • 如果用的是旧版本GLSL(比如120),把in/out关键字换成attribute/varying即可。

内容的提问来源于stack exchange,提问作者Mahathi Vempati

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:06:00