gpt4 book ai didi

opengl - 我可以将 float 和整数都打包到同一个数组缓冲区中吗?

转载 作者:行者123 更新时间:2023-12-01 15:48:27 29 4
gpt4 key购买 nike

...因为 float 看起来很好,但整数有问题。

基本上我有一个名为“BlockInstance”的结构,它包含一个 vec3 和一个 int。我有这些 BlockInstances 的数组,我像这样缓冲(为清楚起见,从 C# 翻译成 C):

glBindBuffer(GL_ARRAY_BUFFER, bufferHandle);
glBufferData(GL_ARRAY_BUFFER, sizeof(BlockInstance)*numBlocks, blockData, GL_DYNAMIC_DRAW);
glVertexAttribPointer(3,3,GL_FLOAT,false,16,0);
glVertexAttribPointer(4,1,GL_INT,false,16,12);
glVertexAttribDivisor(3,1);
glVertexAttribDivisor(4,1);

我的顶点着色器看起来像这样:

#version 330

layout (location = 0) in vec3 Position;
layout (location = 1) in vec2 TexCoord;
layout (location = 2) in vec3 Normal;
layout (location = 3) in vec3 Translation;
layout (location = 4) in int TexIndex;

uniform mat4 ProjectionMatrix;

out vec2 TexCoord0;

void main()
{
mat4 trans = mat4(
1,0,0,0,
0,1,0,0,
0,0,1,0,
Translation.x,Translation.y,Translation.z,1);
gl_Position = ProjectionMatrix * trans * vec4(Position, 1.0);
TexCoord0 = vec2(TexCoord.x+TexIndex,TexCoord.y)/16;
}

当我将 GLSL 着色器最后一行的 TexIndex 替换为 0、1 或 2 等常量时,我​​的纹理效果很好,但如果我保持原样,它们就会出现都弄错了,所以这个数字一定有问题,对吧?但我不知道它会出现什么,所以很难调试。

我查看了我的 BlockInstances 数组,它们都设置为 1、2 或 19,所以我认为我的输入没有错误...

还能是什么?


请注意,我使用的是 sprite 贴图纹理,其中每个图 block 都是 16x16 像素,但我的 TexCoords 在 0-1 范围内,所以我向它添加一个整数以选择哪个图 block ,然后将它除以16( map 也是 16x16 block )将其放回正确的范围内。我的想法是将最后一行替换为

TexCoord0 = vec2(TexCoord.x+(TexIndex%16),TexCoord.y+(TexIndex/16))/16;

-- GLSL 进行整数运算,对吗?一个整数除以一个整数会得到整数吗?


如果我尝试这样做:

TexCoord0 = vec2(TexCoord.x+(TexIndex%16),TexCoord.y)/16;

纹理看起来不错,但它没有使用正确的 Sprite 。 (看起来是在使用第一个 Sprite )

如果我这样做:

TexCoord0 = vec2(TexCoord.x+(TexIndex%16),TexCoord.y+(TexIndex/16))/16;

出来的时候都是白色的。这让我相信 TexIndex 是一个非常大的数字(无论如何都大于 256)并且它可能是 16 的倍数。

最佳答案

layout (location = 4) in int TexIndex;

这是你的问题。

glVertexAttribPointer用于发送将转换为 float 值的数据。它用于提供浮点属性。传递整数是可能的,但这些整数会被转换为 float ,因为这就是 glVertexAttribPointer 的用途。

您需要的是 glVertexAttribIPointer(注意 I)。这用于提供有符号和无符号整数数据。

因此,如果您将顶点着色器输入声明为 float 或一些无前缀的 vec,您可以使用 glVertexAttribPointer 来提供它。如果将输入声明为 intuintivecuvec,则使用 glVertexAttribIPointer.

关于opengl - 我可以将 float 和整数都打包到同一个数组缓冲区中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9145454/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com