Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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
使用OpenGL在Java中更改纹理中的某些颜色_Java_Opengl_Colors_Textures_Pixels - Fatal编程技术网

使用OpenGL在Java中更改纹理中的某些颜色

使用OpenGL在Java中更改纹理中的某些颜色,java,opengl,colors,textures,pixels,Java,Opengl,Colors,Textures,Pixels,我需要能够创建一个纹理副本,并在java中将该副本中的某些颜色更改为其他颜色。我对OpenGL库不是很熟悉,我不知道它提供了什么方法来实现这一点。我需要知道一种改变纹理中单个像素颜色的好方法,以及如何获得纹理中单个像素的颜色,以及如何复制纹理。如果这个问题太宽泛,我很抱歉,但我正在寻找一个宽泛的答案。您可以使用glTexSubImage2D函数更改纹理中单个像素的颜色。下面是函数标题: void glTexSubImage2D( GLenum target, GLint level, GLint

我需要能够创建一个纹理副本,并在java中将该副本中的某些颜色更改为其他颜色。我对OpenGL库不是很熟悉,我不知道它提供了什么方法来实现这一点。我需要知道一种改变纹理中单个像素颜色的好方法,以及如何获得纹理中单个像素的颜色,以及如何复制纹理。如果这个问题太宽泛,我很抱歉,但我正在寻找一个宽泛的答案。

您可以使用glTexSubImage2D函数更改纹理中单个像素的颜色。下面是函数标题:

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。