0

我在 Java 中使用 OpenGL,我一直在尝试在后台缓冲区上绘制一些东西,将其复制到纹理上,然后将纹理绘制到屏幕上。

这是我用来进行复制的代码。

int textureNumber = GL11.glGenTextures();

GL11.glBindTexture(GL11.GL_TEXTURE_2D, textureNumber);

GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL11.GL_REPEAT);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL11.GL_REPEAT);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);

GL11.glTexEnvf(GL11.GL_TEXTURE_ENV, GL11.GL_TEXTURE_ENV_MODE, GL11.GL_REPLACE);

GL11.glCopyTexImage2D
(
  GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA,
  0, 0,
  NewMath.roundUpTwo(width), NewMath.roundUpTwo(height),
  0
);

(roundUpTwo 方法只是将宽度和高度四舍五入到最接近的 2 次幂。)

现在这里的问题是,当我将纹理重新绘制到屏幕上时,它的呈现方式与渲染到后台缓冲区的方式不同。

我没有足够的代表直接发布图片 <_< 所以这里是行为的截图。

在此处输入图像描述

请注意,左上角是我直接渲染到屏幕时发生的情况,右下角是我将其复制到纹理然后渲染纹理时发生的情况。

我认为正在发生的事情是,我正在绘制的对象是由许多使用 alpha 透明度和混合函数绘制的三角形组成的,而 CopyTexImage2D 函数并没有保留它。不过我不完全确定,因为我真的不知道这里发生了什么。

这就是问题所在,我该如何解决?如果不是,那是什么,我该如何解决?

4

1 回答 1

0

我的绘图是由许多用 alpha 透明度绘制的三角形组成的……而且…… CopyTexImage2D 函数没有保留它

这不是它的工作原理。一旦绘制了图片,无论是哪个帧缓冲区,剩下的都是像素值。从那时起,使用的几何形状就不再重要了。

最可能的问题是,您正在渲染该纹理,而之前的绘图步骤的状态仍处于启用状态,并且那些正在“流血”。但是,如果没有看到用于绘制所有不同阶段的源代码,就很难说清楚。我建议您编辑您的问题,添加该代码。

于 2013-06-16T10:42:57.877 回答