OpenGL - 纹理一个基本的立方体

Posted

技术标签:

【中文标题】OpenGL - 纹理一个基本的立方体【英文标题】:OpenGL - Texturing a basic cube 【发布时间】:2013-04-10 13:11:25 【问题描述】:

我正在尝试仅使用一种纹理来对立方体进行纹理处理,但只在每个面上渲染它的一部分。

这是我现在想使用的纹理:

我的目标是通过着色器完成这项工作,我还没有使用它们的经验,但我正在努力学习..

这是我当前的片段着色器:

uniform sampler2D tex0;

void main()

    vec2 pos = vec2(gl_TexCoord[0] / 4.0);
    vec3 test = texture2D(tex0,pos).rgb;
    gl_FragColor.rgb = test;

显然这只是开始,所有的边都使用了相同的纹理部分, 我只是着色器的新手,我什至不确定这是否真的可以这样做..

我只是不知道是否真的可以确定我当前在哪张脸上等等,我想我可能能够将有关顶点的信息传递给片段着色器然后根据它采取行动?

附注: 我首先这样做是因为我想要一个功能,如果立方体将被调整大小,每一面的纹理都会重复而不是拉伸

【问题讨论】:

【参考方案1】:

gl_TexCoord 已弃用。您应该创建另一个通用顶点属性并在其中存储纹理坐标。

虽然在片段着色器中应用纹理,但纹理坐标通常首先提供给顶点着色器,然后在所有生成的片段中线性插值:

#version 430
//...
layout(location = 1) in vec2 attr_texcoord;
out vec2 out_texcoord;

void main () 
    out_texcoord = attr_texcoord;
    //...

现在您可以在片段着色器中使用out_texcoord

【讨论】:

感谢您的快速回答,您是否可以进一步解释一下我实际上是如何知道我目前的脸型的?另外,我如何能够偏移纹理以显示它的其他部分?因为目前我得到的立方体只显示纹理的“顶部”部分,无论我做什么,我都看不到让它显示其他部分的好方法 “创建另一个通用的顶点属性并在其中存储纹理坐标”这句话你看懂了吗? 我想我没有?我错过了什么? ;x 怎么会知道没有完全理解?我建议先reading this(前几章)。 好吧,虽然我想我现在明白你的意思了。如果我错了,请纠正我,但是在创建网格时为每个顶点添加一个属性?并且该属性将保存 xyz 位置?

以上是关于OpenGL - 纹理一个基本的立方体的主要内容,如果未能解决你的问题,请参考以下文章

opengl 把纹理映射到立方体的六个面。

使用 GLUT 在立方体上的 OpenGL 多纹理映射

立方体侧面的纹理与opengl

纹理不适用于我在 C++ 和 OpenGL 中的立方体

SDL 3d OpenGL:立方体上的纹理产生空白屏幕

Opengl ES 1.x NDK实例开发之七:旋转的纹理立方体