使用OpenGL ES对3d形状进行着色和纹理处理

最后的伯特

我正在尝试学习一些适用于Android的OpenGL ES,完全是为了娱乐。图形编程对我来说还是很新的,如果这是一个愚蠢的问题,请对不起。

我已经阅读了一些示例和教程,并且可以创建形状,通过触摸事件移动相机等。按照Google的教程,我对其进行了修改以制作一些3D形状。到目前为止,我对所有这些都感到满意。

目前,我的形状在所有面上都具有相同的颜色,而且我不清楚如何用当前获得的代码分别对它们进行着色/纹理化(我只是通过基本实验在Google教程上构建)。

我看过的所有其他示例都使用glDrawArrays而不是glDrawElements。通过这种方式定义形状似乎很麻烦,但是随后您拥有一组独特的顶点,这使着色(和法线)显得更加明显。

我的多维数据集的draw方法在下面,因此您可以看到我所在的位置。为了进一步发展,我是否必须采取其他措施?如果是这样,这是否会使glDrawElements的用处大大减少?

public void draw(float[] mvpMatrix) {
    // Add program to OpenGL environment
    GLES20.glUseProgram(mProgram);

    // get handle to vertex shader's vPosition member
    mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");

    // Enable a handle to the vertices
    GLES20.glEnableVertexAttribArray(mPositionHandle);

    // Prepare the cube coordinate data
    GLES20.glVertexAttribPointer(
            mPositionHandle, COORDS_PER_VERTEX,
            GLES20.GL_FLOAT, false,
            vertexStride, vertexBuffer);

    // get handle to fragment shader's vColor member
    mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");

    // Set color for drawing the Cube
    GLES20.glUniform4fv(mColorHandle, 1, color, 0);

    // get handle to shape's transformation matrix
    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");

    // Apply the projection and view transformation
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);

    // Draw the cube, tell it that vertices describe triangles
    GLES20.glDrawElements(
            GLES20.GL_TRIANGLES, drawOrder.length,
            GLES20.GL_UNSIGNED_SHORT, drawListBuffer);
}
马蒂奇·欧布拉克(Matic Oblak)

要为形状的某个部分着色,您需要定义每个顶点的颜色。在您的情况下,vPosition意味着您需要在旁边的另一个属性代表颜色。在着色器中,您将需要添加此新属性并添加一个可变矢量,以将颜色传递给片段着色器。虽然在顶点着色器中不需要任何变换。同样不要忘记启用color属性数组并设置指针...

首先尝试这样做,并为每个顶点指定不同的颜色,以查看会发生什么。

如果正确执行此操作,您将看到多维数据集的每个面现在都有渐变颜色,并且只有多维数据集的角具有您指定的确切颜色。这是由于插值造成的,您可以做很多事情来解决此问题,但是创建顶点缓冲区的方式有所不同:

因此,这就是绘制数组或元素之间的区别所在。通过使用元素,您可以拥有索引缓冲区,以通过重用相同的顶点来降低实际顶点缓冲区的大小。但是,对于具有彩色面的多维数据集,这些顶点不再相同,因此无法再共享这些顶点。如果要使一个具有6种不同颜色的立方体分别代表一个面,则可以看到每个顶点(角)实际上包含3种不同颜色,每个面对应一种颜色。因此,包含位置和颜色的顶点必须具有相同的位置和颜色,才能真正相同...

因此,这里必须要做的是创建3 * 8顶点和索引,而不是创建8 *顶点和索引,以绘制这样的立方体。完成后,您会看到索引数和使用的顶点数相同,因此使用元素不会获得任何收益(但是如果您愿意,还是可以的),因此更容易绘制数组。

对于法线或纹理坐标,在立方体上也会发生这种情况,您只需要制作8 * 3的顶点即可。

请注意,虽然立方体只是您需要为此做的那些不友好的形状之一。如果您宁愿用大量三角形绘制一个球体,则无需增加顶点数就可以进行很好的纹理化或照明(使用法线)。实际上,将球体顶点数量增加三倍并执行与立方体相同的步骤将使形状看起来更糟。

我建议您尝试一下这种形状,法线,颜色,纹理,您将从自己的经验中学到很多东西。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用UV Map OpenGL纹理化3d对象

来自分类Dev

使用Knitr对R输入和输出进行着色

来自分类Dev

使用 OpenGL 加载纹理

来自分类Dev

在Haskell中使用多个纹理进行着色器编程

来自分类Dev

如何使用顶点位置坐标进行纹理处理?openGL,c ++

来自分类Dev

Android-如何使用opengl-es在3D立方体上渲染视频纹理?

来自分类Dev

OpenGL 3D模型纹理

来自分类Dev

缩放3D形状(OpenGL和C ++)

来自分类Dev

使用OpenGL和3D建模软件之间的区别

来自分类Dev

使用OpenGL和QT进行纹理映射-C ++

来自分类Dev

使用SOIL进行OpenGL纹理化

来自分类Dev

使用C ++在OpenGL中纹理3d多边形

来自分类Dev

如何使用pyqtgraph和OpenGL在两个更新的3D点之间连接椭圆或圆柱形状?

来自分类Dev

加载纹理-使用OpenGl,LWJGL和SlickUtil

来自分类Dev

使用现代OpenGL渲染纹理

来自分类Dev

使用C ++在OpenGL中使用键盘移动3D形状

来自分类Dev

在Android上为片段着色器使用3D纹理

来自分类Dev

在OpenGL中移动3d形状

来自分类Dev

使用opengl进行图块渲染

来自分类Dev

如何分别对3D模型进行纹理化(使用不同的纹理文件)?

来自分类Dev

如何分别对3D模型进行纹理化(使用不同的纹理文件)?

来自分类Dev

在OpenGL ES中使用UIMotionEffect

来自分类Dev

使用SOIL使用OpenGL映射纹理

来自分类Dev

使用SOIL使用OpenGL映射纹理

来自分类Dev

CUDA / OpenGL互操作,使用CUDA绘制到OpenGL纹理

来自分类Dev

OpenGL使用glNewList和glDrawElements

来自分类Dev

如何使用qt和qglwidget将两个纹理传递给opengl着色器

来自分类Dev

如何使用qt和qglwidget将两个纹理传递给opengl着色器

来自分类Dev

从CUDA访问VTK OpenGL对象(3D纹理)

Related 相关文章

热门标签

归档