我有一个简单的16 x 16网格,我应用了一个纹理。纹理文件分为四个部分 - 每个部分都有不同的颜色。默认情况下,每个方块都显示为绿色(文件的左上角部分)。如果单击一个正方形,我应用红色部分(文件的右上角部分)。现在我想点击时让广场完全消失。我想我可以使用透明纹理,但我希望我不必这样做以避免加载/重新加载两个不同的纹理文件。
以下是我用来更新纹理vbo的代码:
//I don't bother offsetting my changes. I simply update the 'UVs'
//array and then copy the entire thing to the floatbuffer.
public void updateTexture(int offset)
{
//populate the texture buffer
//fbtex is a floatbuffer (16x16x8 in size). UVs is an array, same size.
fbtex.put( UVs );
fbtex.rewind();
glBindBuffer(GL_ARRAY_BUFFER, vboHandles.get(TEXTURE_IDX)); //the texture data
glBufferSubData(GL_ARRAY_BUFFER, offset, fbtex);
fbtex.clear(); //don't need this anymore
}
VBO将包含最多256个我的绿色实例:
public float[] UV_0 = { 0.02f,0.02f,
0.02f,0.24f,
0.24f,0.24f,
0.24f,0.02f};
或更少,如果包括我的一些红色合作:
public float[] UV_1 = { 0.24f,0.02f,
0.48f,0.02f,
0.48f,0.24f,
0.24f,0.24f};
我能对VBO数据做些什么来绘制一个看不见的部分吗?那么可以看到背景中的对象吗?
答案 0 :(得分:2)
你不能渲染VBO的部分内容。通常你用
之类的东西绘制整个数据glDrawArrays(GL_TRIANGLES, 0, numElements);
glDrawArrays
使用first
和count
参数,您可以使用该参数仅渲染VBO的一部分。因此,如果您不想渲染某些数据,您可以在两次绘制调用之前和之后渲染所有数据。
答案 1 :(得分:1)
如果创建RGBA格式纹理而不是RGB,只需在纹理中创建一个透明部分即可。 (Alpha /不透明度为零。)然后你只需要像其他任何一样用透明方块的坐标更新纹理坐标VBO。
或者,如果颜色是平的,没有渐变或图案,每个网格方块只有一个RGB值,为什么要使用纹理呢?将“UV”缓冲区更改为“RGBA”缓冲区,只需将每个顶点的颜色设置为红色/绿色/透明。