我用这段代码生成我的VBO
int SCREEN_WIDTH = 800;
int SCREEN_HEIGHT = 480;
int PIXEL_PER_VERTEX = 4;
int CAVERN_TEXTURE_WIDTH = 1024;
int CAVERN_TEXTURE_HEIGHT = 512;
final int vertexCount = ((SCREEN_WIDTH / PIXEL_PER_VERTEX) +1 ) * 2;
final float[] bufferDataLowerCave = new float[vertexCount * CavernBoundMesh.VERTEX_SIZE];
for(int i=0; i < vertexCount; i += 2) {
bufferDataLowerCave[i * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.VERTEX_INDEX_X] = PIXEL_PER_VERTEX * i / 2.f;
bufferDataLowerCave[i * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.VERTEX_INDEX_Y] = 200;
bufferDataLowerCave[i * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.TEXTURECOORDINATES_INDEX_U] = ( (float) PIXEL_PER_VERTEX * i / 2.f) / SCREEN_WIDTH;
bufferDataLowerCave[i * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.TEXTURECOORDINATES_INDEX_V] = 0.f;
bufferDataLowerCave[(i + 1 ) * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.VERTEX_INDEX_X] = PIXEL_PER_VERTEX * i / 2;
bufferDataLowerCave[(i + 1 ) * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.VERTEX_INDEX_Y] = 0;
bufferDataLowerCave[(i + 1 ) * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.TEXTURECOORDINATES_INDEX_U] = ( (float) PIXEL_PER_VERTEX * i / 2.f) / SCREEN_WIDTH;
bufferDataLowerCave[(i + 1 ) * CavernBoundMesh.VERTEX_SIZE + CavernBoundMesh.TEXTURECOORDINATES_INDEX_V] = 0.5f;
}
我正在使用TRIANGLE_STRIP绘制网格(以原点为中心)。
抱歉,由于我使用的是引擎(AndEngine),因此没有openGL代码。但如果你真的需要,我可以尝试追踪它..
正如你在图像中看到的那样,最后2个顶点与原点中的顶点连接。我调试了VBO的创建,这是第一个和最后一个顶点
//X Y U V
[0.0, 200.0, 0.0, 0.0,
0.0, 0.0, 0.0, 0.5,
4.0, 200.0, 0.0050, 0.0,
4.0, 0.0, 0.0050, 0.5,
8.0, 200.0, 0.01, 0.0,
8.0, 0.0, 0.01, 0.5,
12.0, 200.0, 0.015, 0.0,
12.0, 0.0, 0.015, 0.5,
16.0, 200.0, 0.02, 0.0,
16.0, 0.0, 0.02, 0.5
[..]
780.0, 200.0, 0.975, 0.0,
780.0, 0.0, 0.975, 0.5,
784.0, 200.0, 0.98, 0.0,
784.0, 0.0, 0.98, 0.5,
788.0, 200.0, 0.985, 0.0,
788.0, 0.0, 0.985, 0.5,
792.0, 200.0, 0.99, 0.0,
792.0, 0.0, 0.99, 0.5,
796.0, 200.0, 0.995, 0.0,
796.0, 0.0, 0.995, 0.5]
这是我使用的顶点着色器
uniform mat4 u_modelViewProjectionMatrix;
uniform float u_elapsedSeconds;
attribute vec4 a_position;
attribute vec2 a_textureCoordinates;
varying vec2 v_textureCoordinates;
void main(void)
{
v_textureCoordinates = a_textureCoordinates;
vec4 temp_position = u_modelViewProjectionMatrix * a_position;
float variation = 0.3*sin((u_elapsedSeconds + 1.5 * temp_position.x))*(1.0 + temp_position.y);
temp_position.y += variation;
gl_Position = temp_position;
}
我对这些东西很新,所以我不太了解规格及其工作原理,但我无法真正了解产生这种奇怪效果的原因。你能救我一下吗?
EDIT1:
我做了一些测试.. 即使使用标准顶点和片段着色器,它只是设置位置和从纹理中获取颜色,它会产生奇怪的结果。
EDIT2: 还有一些图像,这次只有2个标准的vert和frag着色器用于位置和纹理颜色(这些图像来自平板电脑,而第一个来自手机)
答案 0 :(得分:2)
我很确定你为绘图代码指定了错误数量的图元,因为顶点本身看起来不错。当您对openGL或任何其他3D基本绘图进行绘图调用时,不要指定要绘制的顶点数,而是指定基元的数量。在你的情况下,一个基元是一个三角形。
因为它是一个三角形条带,所以在你的通话中它总是numberOfVertices - 2
原语。如果它是三角形列表,它将是numberOfVertices/3
,对于三角形扇形,它再次为numberOfVertices - 2
。
由于您可能指定要绘制的三角形比要绘制的数据多,所以它可能使用了一些默认的(0,0,0,0)
,这说明它试图在左下角绘制两个退化三角形,这也是引用纹理坐标0,0
。这也是有道理的,因为甚至没有顶点在列表中具有位置0,0
和T / U 0,0
,因此最后一个顶点必须是某个默认值。
答案 1 :(得分:0)
好的,我解决了。
尝试libgdx后(我真的不喜欢它,它接缝很多实用功能都缺失了,我还没有真正掌握它背后的概念,例如它如何处理纹理,如何管理实体等等。 )并用jni实现了一个非常小的本地语言渲染器,并且还设置了cocos-2d-x(但是没有尝试过,因为我第一次使用jni代码并编写了上面提到的渲染器)我又回到了AndEngine。
我成功地设法用VBO和IBO实现网格,但最后我通过在VBO的开始和结束处复制(添加2个相同的顶点)来解决我的问题,以便其他三角形退化并且是没画。所以,这是最常见的解决方法,但只要它有效..