【发布时间】:2014-10-13 02:38:29
【问题描述】:
我必须将一个物理立方体与我计算机上的投影仪显示的图像进行映射。我立即意识到使用 3D 立方体和相机投影来尝试将虚拟图像拟合到真实对象上的问题,因此我决定简化问题并使用立方体的 2D 表示并在 2D 空间中移动每个顶点直到它适合对象。该软件现在已经完成,除了一个小细节:纹理。
我正在使用 LWJGL,我的数据结构基于他们文档中的一些示例。
我使用 7 个顶点来表示 2D 空间中真实立方体的 3 个可见面,这会创建覆盖每个面的 3 个梯形(或不规则四边形),我将它们映射到您在此看到的 ST(或 UV)坐标图片,记住这都是二维的:
这是一个代码块,我将顶点数据加载到缓冲区中,它全部保存到 VBO 中,顺序为 XYZWRGBASTPQ(注意 Z 始终为 0,PQ 默认为 0,1):
vertices = new VertexData[7];
vertices[0] = new VertexData().setXY(0, 0).setST(0.5f, 0.5f);
vertices[1] = new VertexData().setXY(0.5f, 1f/3).setST(0.5f, 0);
vertices[2] = new VertexData().setXY(0, 2f/3).setST(0, 0);
vertices[3] = new VertexData().setXY(-0.5f, 1f/3).setST(0, 0.5f);
vertices[4] = new VertexData().setXY(-0.5f, -1f/3).setST(0, 1);
vertices[5] = new VertexData().setXY(0, -2f/3).setST(0.5f, 1);
vertices[6] = new VertexData().setXY(0.5f, -1f/3).setST(1, 1);
0是六边形的中心,从1-6,从右上角逆时针,画成三角形扇形。
梯形仍然是平行四边形时一切正常,这是另一个纹理测试:
但问题是当边不相等时,纹理会投影到三角形上,所以当它尝试投影纹理时,它看起来不像预期的那样:
我阅读了很多关于这个主题的内容,其中一些:
Getting to know the Q texture coordinate...
Perspective correct texturing of trapezoid in OpenGL ES 2.0
Quadrilateral Interpolation, Part 1
到目前为止,我还没有解决这个问题,我只知道这与纹理的 Q 坐标有关。
我的顶点着色器是最低限度的:
#version 150 core
in vec4 in_color;
in vec4 in_position;
in vec4 in_texture;
out vec4 pass_color;
out vec4 pass_texture;
void main(void) {
pass_color = in_color;
pass_texture = in_texture;
gl_Position = in_position;
}
而且我的片段着色器非常简单,现在我使用的是 textureProj,因为我试图摆弄 Q 坐标。
#version 330 core
in vec4 pass_color;
in vec4 pass_texture;
out vec4 color;
uniform sampler2D texture_diffuse;
void main(void) {
color = pass_color;
color = textureProj(texture_diffuse, pass_texture);
}
我愿意发布每段代码以备不时之需。我只需要朝着正确的方向前进。
【问题讨论】:
-
您的顶点需要适当的深度值(添加 z 维度)以允许透视插值。顺便说一句,您的线框模型看起来不对(与上面的立方体图像相反)。
-
没必要,我已经解决了,稍后我会发布我的解决方案。谢谢!
标签: opengl 2d glsl lwjgl texture-mapping