Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我如何才能不将纹理应用于模型的一部分?_Java_Opengl_3d_Lwjgl - Fatal编程技术网

Java 我如何才能不将纹理应用于模型的一部分?

Java 我如何才能不将纹理应用于模型的一部分?,java,opengl,3d,lwjgl,Java,Opengl,3d,Lwjgl,我有一个简单的16 x 16网格,我应用一个纹理。纹理文件分为四个部分-每个部分具有不同的颜色。默认情况下,每个正方形的颜色为绿色(文件的左上部分)。如果单击一个正方形,我将应用红色部分(文件的右上部分)。现在我想让正方形在单击时完全消失。我想我可以使用透明纹理,但我希望我不必这样做,以避免加载/重新加载两个不同的纹理文件 以下是我用于更新纹理vbo的代码: //I don't bother offsetting my changes. I simply update the 'UVs'

我有一个简单的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数据做些什么来绘制一个不可见的部分吗?因此可以看到背景中的对象,例如?

您不能渲染VBO的某些部分。通常情况下,您可以使用以下内容绘制整个数据

glDrawArrays(GL_TRIANGLES, 0, numElements);

获取一个
first
count
参数,您可以使用该参数仅渲染VBO的一部分。因此,如果不想渲染某些数据,可以在两次绘制调用中渲染此数据之前和之后的所有数据。

您不能渲染VBO的部分。通常情况下,您可以使用以下内容绘制整个数据

glDrawArrays(GL_TRIANGLES, 0, numElements);

获取一个
first
count
参数,您可以使用该参数仅渲染VBO的一部分。因此,如果不想渲染某些数据,可以在两次绘制调用中渲染此数据之前和之后的所有数据。

如果创建RGBA格式的纹理而不是RGB,只需使纹理中的一部分透明即可。(Alpha/opacity zero。)然后您只需要使用透明正方形的坐标更新纹理坐标VBO,就像任何其他坐标一样


或者,如果颜色是平坦的,没有渐变或图案,每个网格正方形只有一个RGB值,为什么要使用纹理呢?将“UV”缓冲区更改为“RGBA”缓冲区,只需将每个顶点的颜色设置为红色/绿色/透明。

如果创建RGBA格式的纹理而不是RGB,只需使纹理中的一部分透明即可。(Alpha/opacity zero。)然后您只需要使用透明正方形的坐标更新纹理坐标VBO,就像任何其他坐标一样


或者,如果颜色是平坦的,没有渐变或图案,每个网格正方形只有一个RGB值,为什么要使用纹理呢?将“UV”缓冲区更改为“RGBA”缓冲区,只需将每个顶点的颜色设置为红色/绿色/透明。

使用纹理的原因是我希望使用绿色,但在着色等方面有一些细节。但对于天空或水的着色,我肯定会使用RGBA-谢谢提醒!我需要一个更好的图形编辑器,使我能够包括在我的纹理透明部分。我最终会需要它们的。然而,对于这个解决方案,我真正想要的是一种避免渲染不可见顶点的方法。我的解决方案与javac的建议略有不同,我使用了GLDrawerElements,所以我只是跳过了我不想要的元素。使用纹理的原因是我想要绿色,但要有一些细节,比如阴影等。但当然,对于天空或水的着色,我会使用RGBA-谢谢提醒!我需要一个更好的图形编辑器,使我能够包括在我的纹理透明部分。我最终会需要它们的。然而,对于这个解决方案,我真正想要的是一种避免渲染不可见顶点的方法。我的解决方案与javac建议的略有不同,因为我使用了gldrawerelements,所以我只是跳过了我不想要的元素。