我正在使用 LWJGL(适用于 Java 的开放GL)库进行纹理映射。以下是从文件中读取图像的代码:
BufferedImage image = ImageIO.read(new File(url));
以字节数组形式获取数据栅格(图像像素)的代码:
DataBufferByte imageByteBuffer = ((DataBufferByte)image.getRaster().getDataBuffer());
byte[] bytePixels = imageByteBuffer.getData();
现在,创建“bytePixels”数组并将其放入字节缓冲区的代码:
pixels = BufferUtils.createByteBuffer(bytePixels.length);
pixels.put(bytePixels);
pixels.flip();
这里用于将所有这些绑定到缓冲区:
id = GL11.glGenTextures();
GL11.glBindTexture(GL11.GL_TEXTURE_2D, id);
GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_NEAREST);
GL11.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_NEAREST);
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, image.getWidth(), image.getHeight(), 0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, pixels);
问题是,图像纹理的颜色与原始图像颜色不同!
原始图片:
纹理图像:
这个答案OpenGL渲染纹理与原始图像颜色不同?,不能解决这个问题,因为GL_BGR
在lwjgl Class GL11中无效!
问题是红色和蓝色通道被交换。
在OpenGL中,可以使用GL_BGR
格式,该格式指定交换颜色通道的内部格式(与GL_RGB
相比)。
请参阅OpenGL 4参考页-<代码>GLTEXMIMAGE2D</代码><br>和OpenGL以不同于原始图像的颜色渲染纹理?。
在OpenGL ES中,您必须手动交换红色和蓝色通道,因为缺少内部格式GL_BGR
。
请参阅 OpenGL ES 3.0 参考页 - GLTexImage2D
和 lwjgl - 类 GL11
。
pixels = BufferUtils.createByteBuffer(bytePixels.length);
pixels.put(bytePixels);
pixels.flip();
for (int i = 0; i < pixels.length; i += 3) {
byte t = pixels[i];
pixels[i] = pixels[i+2];
pixels[i+2] = t;
}
另一种可能性是在OpenGL ES 3.0中或通过OpenGL扩展< code>EXT_texture_swizzle给出的:
自OpenGL ES 3.0以来,您可以使用纹理旋转参数交换颜色通道。参见<code>gltex参数:
GL_TEXTURE_SWIZZLE_R代码
设置将在返回着色器之前应用于纹理元素的r组件的swizzle。param的有效值为< code>GL_RED 、< code>GL_GREEN 、< code>GL_BLUE 、< code>GL_ALPHA 、< code>GL_ZERO和< code>GL_ONE。如果< code > GL _ TEXTURE _ SWIZZLE _ R 是< code>GL_RED,R的值将从提取的纹理元素的第一个通道中获取。如果< code > GL _ TEXTURE _ SWIZZLE _ R 是< code>GL_GREEN,R的值将从提取的纹理元素的第二个通道中获取。...
这意味着,通过将以下纹理参数设置为纹理对象,在查找纹理时将交换颜色通道:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_BLUE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED);
规范中的相关部分可在OpenGL ES 3.0.5规范中找到;3.8.14纹理状态;第162页
要检查 OpenGL 扩展是否有效,可以使用 glGetString(GL_EXTENSIONS),
它返回一个以空格分隔的受支持扩展列表。
请参阅glTexImage2D的alos android位图像素格式。
主要内容:颜色命名,getrgb()方法,getcolor()Pillow 提供了颜色处理模块 ImageColor,该模块支持不同格式的颜色,比如 RGB 格式的颜色三元组、十六进制的颜色名称(#ff0000)以及颜色英文单词("red")。同时,它还可以将 CSS(层叠样式表,用来修饰网页)风格的颜色转换为 RGB 格式。 注意,在 ImageColor 模块对颜色的大小并不敏感,比如 "Red" 也可以写为 " red"。 颜色命名 ImageColo
之前用过了静态的纹理设置材质,这次来尝试一下动态的变换,这次来尝试颜色变换 先创建工程,步骤略 添加一个管线,参考官方示例Polyline Volume,每个示例的代码,都用一下,说不定学到点新东西呢~ (#^.^#) 这里按理说应该是要给纹理赋值了,要它动态变化,一般有两种思路,其一是赋值一次,然后之后用代码(定时器)动态修改材质,其二是使用回调,在上一篇鹰眼图中尝试过,发现回调效果比较好,不会
不太确定问题发生在哪里。我在Blender有一个模型看起来是这样的: 我有它所有的UV贴图和这样的 ,蓝色高亮的边缘是从一个透明的.png纹理。下面是节点编辑器: 现在,当我按照LibGDX建议导出到.fbx时,我使用以下设置: 但当我通过fbx-convert运行它并生成我的g3dj文件时,材料显示如下: 没有图像纹理在视线内(即使当不透明度更改为1.0)。是不是有什么其他的东西我应该做,将使它
主要的cpp 附言 输入布局(顶点属性)工作正常。TexIndex已正确传输。1.0f和0.0f 但问题是 //片段着色器 两者都返回相同的纹理颜色,但它实际上与test1的纹理不同。png和test2。巴布亚新几内亚。我的代码有什么问题? 我试着跟随@rabbi76的答案 已应用颜色,但仍从同一纹理采样。看起来有点像glActiveTexture(i);没用。 ps.test1。png和test
输出的内容显示,texture对象的colorSpace已经改变了,但是页面没有重新渲染。 即便在使用后,texture.needsUpdate = true 后,仍然没有效果。 值得注意的是,当我不设置texture的颜色空间,即texture.colorSpace = THREE.LinearSRBColorSpace 或者 THREE.NoColorSpace的时候,可以实现页面从linea
问题内容: 我是iOS开发的新手,但我陷入了困境。我正在尝试使用每个面都有不同颜色的SceneKit渲染立方体。 到目前为止,这是我得到的: 但是我希望每张脸都有不同的颜色。我怎么做? 问题答案: 该盒子由六个不同的元素组成(每侧一个)。您可能还已经注意到,几何对象具有 第一种 材料的一个属性,但也具有一系列材料的属性。 具有多个元素和多种材质的对象将选择每个元素的材质增量(并环绕)。 例如4种元