使用OpenGL在Java中更改纹理中的某些颜色
我需要能够创建一个纹理副本,并在java中将该副本中的某些颜色更改为其他颜色。我对OpenGL库不是很熟悉,我不知道它提供了什么方法来实现这一点。我需要知道一种改变纹理中单个像素颜色的好方法,以及如何获得纹理中单个像素的颜色,以及如何复制纹理。如果这个问题太宽泛,我很抱歉,但我正在寻找一个宽泛的答案。您可以使用glTexSubImage2D函数更改纹理中单个像素的颜色。下面是函数标题:使用OpenGL在Java中更改纹理中的某些颜色,java,opengl,colors,textures,pixels,Java,Opengl,Colors,Textures,Pixels,我需要能够创建一个纹理副本,并在java中将该副本中的某些颜色更改为其他颜色。我对OpenGL库不是很熟悉,我不知道它提供了什么方法来实现这一点。我需要知道一种改变纹理中单个像素颜色的好方法,以及如何获得纹理中单个像素的颜色,以及如何复制纹理。如果这个问题太宽泛,我很抱歉,但我正在寻找一个宽泛的答案。您可以使用glTexSubImage2D函数更改纹理中单个像素的颜色。下面是函数标题: void glTexSubImage2D( GLenum target, GLint level, GLint
void glTexSubImage2D( GLenum target, GLint level, GLint xoffset,
GLint yoffset, GLsizei width, GLsizei height, GLenum format,
GLenum type, const GLvoid *data);
在这里:
- target指定目标纹理李>
- 级别指定详细等级编号。级别0是基础图像 水平。级别n是第n个mipmap还原图像
- xoffset指定x方向上的纹理偏移 纹理数组
- yoffset指定图像中y方向上的texel偏移 纹理数组
- width指定纹理子图像的宽度
- height指定纹理子图像的高度
- 格式指定像素数据的格式
- type指定像素数据的数据类型
void updateTexture(const chip8& c8)
{
// Update pixels
for(int y = 0; y < 32; ++y)
for(int x = 0; x < 64; ++x)
if(c8.gfx[(y * 64) + x] == 0)
screenData[y][x][0] = screenData[y][x][1] = screenData[y][x][2] = 0; // Disabled
else
screenData[y][x][0] = screenData[y][x][1] = screenData[y][x][2] = 255; // Enabled
// Update Texture
glTexSubImage2D(GL_TEXTURE_2D, 0 ,0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid*)screenData);
glBegin( GL_QUADS );
glTexCoord2d(0.0, 0.0); glVertex2d(0.0, 0.0);
glTexCoord2d(1.0, 0.0); glVertex2d(display_width, 0.0);
glTexCoord2d(1.0, 1.0); glVertex2d(display_width, display_height);
glTexCoord2d(0.0, 1.0); glVertex2d(0.0, display_height);
glEnd();
}
void updateTexture(常量芯片8和c8)
{
//更新像素
对于(int y=0;y<32;++y)
对于(int x=0;x<64;++x)
如果(c8.gfx[(y*64)+x]==0)
屏幕数据[y][x][0]=屏幕数据[y][x][1]=屏幕数据[y][x][2]=0;//已禁用
其他的
屏幕数据[y][x][0]=屏幕数据[y][x][1]=屏幕数据[y][x][2]=255;//已启用
//更新纹理
glTexSubImage2D(GL_纹理_2D,0,0,屏幕宽度,屏幕高度,GL_RGB,GL_无符号字节,(GLvoid*)屏幕数据);
glBegin(GL_QUADS);
glTexCoord2d(0.0,0.0);glVertex2d(0.0,0.0);
glTexCoord2d(1.0,0.0);glVertex2d(显示宽度,0.0);
glTexCoord2d(1.0,1.0);glVertex2d(显示宽度、显示高度);
glTexCoord2d(0.0,1.0);glVertex2d(0.0,显示高度);
格伦德();
}
参考:
希望有帮助 复制纹理的最简单方法是使用
glCopyTexImage2D()
。这允许您将当前帧缓冲区的内容复制到纹理。如果要使用其他纹理作为源,可以将该纹理设置为帧缓冲区对象(FBO)的内容
假设您已经有一个名为srcTexId
的纹理,要将其用作复制操作的源。现在,您需要首先为目的地创建一个新纹理,我们将其称为dstTexId
:
GLuint dstTexId = 0;
glGenTextures(1, &dstTexId);
glBindTexture(GL_TEXTURE_2D, dstTexId);
glTexParameteri(...);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0,
GL_RGBA, GL_UNSIGNED_BYTE, NULL);
注意最后一个参数使用了NULL
。这意味着使用给定的格式/大小分配纹理内容,但纹理不填充数据
现在我们需要一个FBO,并将其设置为源纹理作为内容:
GLuint fbo = 0;
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
GL_TEXTURE_2D srcTexId, 0);
现在一切就绪,可以执行复制了:
glBindTexture(GL_TEXTURE_2D, dstTexId);
glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 0, 0, width, height, 0);
然后,如果希望保持状态不受干扰,可以清理绑定:
glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
复制纹理的另一个选项是glBlitFramebuffer()
。要使用它,您需要创建两个FBO,一个用于阅读,一个用于写作。所以它需要更多的设置,但也更灵活。例如,它允许您作为副本的一部分调整(缩放)内容的大小,而glCopyTexImage2D()
不支持此操作
要在创建副本后修改纹理的部分,请使用
glTexSubImage2D()
我忘记指定:我正在使用java。