Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.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/6/cplusplus/160.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 OpenGL中十六进制颜色的使用_Java_C++_Opengl_Lwjgl - Fatal编程技术网

Java OpenGL中十六进制颜色的使用

Java OpenGL中十六进制颜色的使用,java,c++,opengl,lwjgl,Java,C++,Opengl,Lwjgl,我有一个理论上的问题:与其在OpenGL数组缓冲区中使用标准RGBA颜色模型,为什么不在每个顶点上多剪切12个字节,并用包含十六进制格式颜色的1个整数替换它呢?然后在着色器中,可以将其转换回vec4 我的意思是,替换这个: glVertexAttribPointer(COL_INDEX, 4, GL_FLOAT, false, stride, offset); 为此: glVertexAttribPointer(COL_INDEX, 1, GL_INT, false, stride, offs

我有一个理论上的问题:与其在OpenGL数组缓冲区中使用标准RGBA颜色模型,为什么不在每个顶点上多剪切12个字节,并用包含十六进制格式颜色的1个整数替换它呢?然后在着色器中,可以将其转换回vec4

我的意思是,替换这个:

glVertexAttribPointer(COL_INDEX, 4, GL_FLOAT, false, stride, offset);
为此:

glVertexAttribPointer(COL_INDEX, 1, GL_INT, false, stride, offset);

我试着在网上到处找,但我没有找到任何关于这个的东西。另外,保存这12个字节有什么性能优势吗?谢谢您的时间。

首先,使用
4*4
作为
glvertexattributepointer
的大小参数是无效的。有效大小为1到4,4正是您想要的,因为您需要4个通道来编码RGBA向量

第二个版本不是很有用。如果我们以同样的方式忽略伪
1*4
,只使用一个通道,原则上它可以工作,但是
glvertexattributepointer
不能用于设置整数属性。这将在着色器中设置一个
float
属性,而数据格式是缓冲区
GL\u INT
。在这里,您将失去一些精度,因为您无法将所有2^32整数值精确地表示为32位浮点,这将完全破坏结果

您可以使用
glvertexattributeinter
(注意中间的I)设置
int
属性

但是,您不需要如此复杂的操作。你所需要的只是

glVertexAttribPointer(COL_INDEX, 4, GL_UNSIGNED_BYTE, GL_TRUE, stride, offset)

使用4个单独的字节作为
vec4
属性,当在着色器中访问时,该属性将自动标准化为[0,1]范围(这是将此函数的
normalize
参数设置为
GL_TRUE
)。

首先,使用
4*4
作为
glvertexattributepointer
的大小参数无效。有效大小为1到4,4正是您想要的,因为您需要4个通道来编码RGBA向量

第二个版本不是很有用。如果我们以同样的方式忽略伪
1*4
,只使用一个通道,原则上它可以工作,但是
glvertexattributepointer
不能用于设置整数属性。这将在着色器中设置一个
float
属性,而数据格式是缓冲区
GL\u INT
。在这里,您将失去一些精度,因为您无法将所有2^32整数值精确地表示为32位浮点,这将完全破坏结果

您可以使用
glvertexattributeinter
(注意中间的I)设置
int
属性

但是,您不需要如此复杂的操作。你所需要的只是

glVertexAttribPointer(COL_INDEX, 4, GL_UNSIGNED_BYTE, GL_TRUE, stride, offset)

使用4个单独的字节作为
vec4
属性,当在着色器中访问该属性时,该属性将自动标准化为[0,1]范围(这是将此函数的
normalize
参数设置为
GL_TRUE
).

编辑问题,使已经给出的答案部分无效,至少有点不幸…@derhass我不是有意这么做的?这是我的一个错误,当我凭记忆提出问题时,直到你说出来我才意识到。我不想让任何可能有这个问题的人感到困惑。编辑这个问题使已经给出的答案部分无效至少有点不幸…@derhass我不是有意这么做的?这是我的一个错误,当我凭记忆提出问题时,直到你说出来我才意识到。我不想把可能有这个问题的人弄糊涂。抱歉。我在步幅和大小参数之间犯了错误——“1*4”和“4*4”不应该出现。我现在改变了这一点。那么64位整数就无效了?将相同的情况应用于将颜色设置为统一的颜色吗?我不知道64位整数必须这样做。实际上,GLSL不支持这种类型。有一些特定于供应商的扩展。而制服则完全不同。道歉。我在步幅和大小参数之间犯了错误——“1*4”和“4*4”不应该出现。我现在改变了这一点。那么64位整数就无效了?将相同的情况应用于将颜色设置为统一的颜色吗?我不知道64位整数必须这样做。实际上,GLSL不支持这种类型。有一些特定于供应商的扩展。而制服则完全不同。