【问题标题】:Cube texturing in opengl3opengl3中的立方体纹理
【发布时间】:2012-12-16 21:58:06
【问题描述】:

只是做我的计算机图形任务 - 将纹理(具有不同数字的 600x400 位图)放在一个立方体上以形成一个合适的骰子。我设法使用“经典”纹理映射来做到这一点:创建顶点并为其添加相应的纹理坐标:

int arrayindex = 0;
float xpos = 0.0f;
float xposEnd = 0.32f;
float ypos = 0.0f;
float yposEnd = 0.49f;
int count = 0;
void quad( int a, int b, int c, int d ) {
    colors[arrayindex] = vertex_colors[a];
    points[arrayindex] = vertices[a];
    tex_coord[arrayindex] = new Point2(xpos, ypos);
    arrayindex++;
    colors[arrayindex] = vertex_colors[b];
    points[arrayindex] = vertices[b];
    tex_coord[arrayindex] = new Point2(xpos, yposEnd);
    arrayindex++;
    colors[arrayindex] = vertex_colors[c];
    points[arrayindex] = vertices[c];
    tex_coord[arrayindex] = new Point2(xposEnd, yposEnd);
    arrayindex++;
    colors[arrayindex] = vertex_colors[a];
    points[arrayindex] = vertices[a];
    tex_coord[arrayindex] = new Point2(xpos, ypos);
    arrayindex++;
    colors[arrayindex] = vertex_colors[c];
    points[arrayindex] = vertices[c];
    tex_coord[arrayindex] = new Point2(xposEnd, yposEnd);
    arrayindex++;
    colors[arrayindex] = vertex_colors[d];
    points[arrayindex] = vertices[d]; 
    tex_coord[arrayindex] = new Point2(xposEnd, ypos);
    arrayindex++;
    xpos = xpos + 0.34f;
    xposEnd = xpos + 0.32f;
    count++;
    if (count == 3) {
        xpos = 0.0f;
        xposEnd = 0.33f;
        ypos = 0.51f;
        yposEnd = 1.0f;
    }
}

void colorcube() {
    quad( 1, 0, 3, 2 );
    quad( 2, 3, 7, 6 );
    quad( 3, 0, 4, 7 );
    quad( 6, 5, 1, 2 );
    quad( 5, 4, 0, 1 );
    quad( 4, 5, 6, 7 );

    pointsBuf = VectorMath.toBuffer(points);
    colorsBuf = VectorMath.toBuffer(colors);
    texcoord = VectorMath.toBuffer(tex_coord);
}

将所有这些东西传递给着色器,然后将它们放在一起。

但是查看幻灯片我注意到这种方法应该是“pre opengl3”。 有没有其他方法可以做到这一点?

在讲座示例中,我注意到将它放在顶点着色器中,但它只是用于简单的 2d 平面,而不是 3d 立方体

tex_coords = vec2(vPosition.x+0.5,vPosition.z+0.5);

然后传递给片段着色器以创建纹理。

【问题讨论】:

    标签: java opengl textures texture-mapping opengl-3


    【解决方案1】:

    但是查看幻灯片我注意到这种方法应该是“pre opengl3”。

    我认为您的幻灯片指的是旧的即时模式。在立即模式下,每个顶点及其属性通过调用立即绘制它们的函数发送到 OpenGL。

    但是,在您的代码中,您正在使用顶点数据初始化缓冲区。然后,这个缓冲区可能作为一个整体传递给 OpenGL,并仅通过一次 OpenGL 调用作为批处理绘制。我写了“可能”,因为您的问题中没有一个 OpenGL 调用。

    【讨论】:

    • 我将顶点、坐标和纹理映射作为 // 设置顶点缓冲区对象 final GLSLAttrib vertices = new GLSLAttrib(pointsBuf, "vPosition", 4);最终 GLSLAttrib 颜色 = 新 GLSLAttrib(colorsBuf, "vColor", 4);最终 GLSLAttrib tex_coord = new GLSLAttrib(texcoord, "vCoord", 2);并与 fragColor 一起使用来创建立方体
    • @mjanisz1:无论GLSLAttrib 是什么,它都不是OpenGL 本身的一部分。它肯定是 3d 派对库的一部分。通过它的命名“GLSLAttrib”我敢打赌,这个东西构建了一个顶点数组甚至一个顶点缓冲区对象。这样做有点奇怪,尤其是因为这种脚手架使 OpenGL 和类和 OOP 无法很好地映射到 OpenGL。
    • 是的,很遗憾我们必须使用老师提供的图书馆。它与“交互式计算机图形与基于着色器的 OPENGL 的自上而下的方法”中的情况不太一样,但对于 java。仍然希望这是将其传递给着色器的正确方法。或者也许有一种方法可以从作为着色器中的“顶点缓冲区对象”传递的顶点计算映射?
    • @mjanisz1:只要您使用顶点缓冲区对象就可以了。这确实是要走的路。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 2014-05-06
    • 2020-08-19
    • 1970-01-01
    • 2014-01-09
    • 2013-02-10
    相关资源
    最近更新 更多