我正在尝试学习一些适用于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);
}
要为形状的某个部分着色,您需要定义每个顶点的颜色。在您的情况下,vPosition
这意味着您需要在旁边的另一个属性代表颜色。在着色器中,您将需要添加此新属性并添加一个可变矢量,以将颜色传递给片段着色器。虽然在顶点着色器中不需要任何变换。同样不要忘记启用color属性数组并设置指针...
首先尝试这样做,并为每个顶点指定不同的颜色,以查看会发生什么。
如果正确执行此操作,您将看到多维数据集的每个面现在都有渐变颜色,并且只有多维数据集的角具有您指定的确切颜色。这是由于插值造成的,您可以做很多事情来解决此问题,但是创建顶点缓冲区的方式有所不同:
因此,这就是绘制数组或元素之间的区别所在。通过使用元素,您可以拥有索引缓冲区,以通过重用相同的顶点来降低实际顶点缓冲区的大小。但是,对于具有彩色面的多维数据集,这些顶点不再相同,因此无法再共享这些顶点。如果要使一个具有6种不同颜色的立方体分别代表一个面,则可以看到每个顶点(角)实际上包含3种不同颜色,每个面对应一种颜色。因此,包含位置和颜色的顶点必须具有相同的位置和颜色,才能真正相同...
因此,这里必须要做的是创建3 * 8顶点和索引,而不是创建8 *顶点和索引,以绘制这样的立方体。完成后,您会看到索引数和使用的顶点数相同,因此使用元素不会获得任何收益(但是如果您愿意,还是可以的),因此更容易绘制数组。
对于法线或纹理坐标,在立方体上也会发生这种情况,您只需要制作8 * 3的顶点即可。
请注意,虽然立方体只是您需要为此做的那些不友好的形状之一。如果您宁愿用大量三角形绘制一个球体,则无需增加顶点数就可以进行很好的纹理化或照明(使用法线)。实际上,将球体顶点数量增加三倍并执行与立方体相同的步骤将使形状看起来更糟。
我建议您尝试一下这种形状,法线,颜色,纹理,您将从自己的经验中学到很多东西。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句