Можно ли упаковать как плавающие, так и целые числа в один и тот же буфер массива?

... потому что поплавки кажутся хорошими, но что-то не так с ними.

По сути, у меня есть структура под названием «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;
}

Когда я заменяюTexIndex в последней строке моего шейдера GLSL с константой, такой как 0, 1 или 2, мои текстуры получаются хорошими, но если я оставлю все как есть, они получатся искаженными, поэтому с числом должно быть что-то не так, правильно? Но я не знаю, что из этого выйдет, так что сложно отлаживать.

Я посмотрел на мой массив BlockInstances, и все они установлены в 1,2 или 19, так что я не думаю, что мой ввод неправильный ...

Что еще это может быть?

Обратите внимание, что я использую текстуру карты спрайтов, где каждая из плиток имеет размер 16x16 пикселей, но мои TexCoords находятся в диапазоне 0-1, поэтому я добавляю к нему целое число, чтобы выбрать какую плитку, а затем делю ее на 16 ( карта также размером 16x16), чтобы вернуть ее в нужный диапазон. Идея в том, что я заменю эту последнюю строку

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

- GLSL делает целочисленную математику, верно? Int, разделенное на int, получится как целое число?

Если я попробую это:

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

Текстура выглядит хорошо, но она не использует правильный спрайт. (Похоже использует первый спрайт)

Если я сделаю это:

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

Выходит все белое. Это заставляет меня верить, чтоTexIndex получается очень большое число (больше 256 в любом случае) и, вероятно, кратно 16.

Ответы на вопрос(1)

Ваш ответ на вопрос