¿Puedo empaquetar tanto flotantes como entrantes en el mismo búfer de matriz?

... porque las carrozas parecen estar saliendo bien, pero hay algo mal con las entradas.

Esencialmente tengo una estructura llamada "BlockInstance" que contiene unavec3 y unint. Tengo una serie de estas BlockInstances que almacené en búfer de esta manera (traduciendo de C # a C para mayor claridad):

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);

Y mi sombreador de vértices se ve así:

#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;
}

Cuando reemplazoTexIndex en la última línea de mi sombreador GLSL con una constante como 0, 1 o 2, mis texturas salen bien, pero si lo dejo así, salen todas destrozadas, por lo que debe haber algo mal con el número , ¿derecho? Pero no sé qué sale, así que es difícil de depurar.

He visto mi conjunto de BlockInstances, y todos están configurados en 1,2, o 19, por lo que no creo que mi entrada sea incorrecta ...

¿Qué más podría ser

Tenga en cuenta que estoy usando una textura de mapa de sprites donde cada uno de los mosaicos es de 16x16 px pero mis TexCoords están en el rango de 0-1, por lo que agrego un número entero para elegir qué mosaico, y luego lo divido por 16 ( el mapa también tiene 16x16 fichas) para volver a colocarlo en el rango adecuado. La idea es reemplazar esa última línea con

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

- GLSL hace matemáticas enteras, ¿verdad? ¿Un int dividido por un int saldrá como número entero?

Si intento esto:

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

La textura se ve bien, pero no está usando el sprite correcto. (Parece estar usando el primer sprite)

Si hago esto:

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

Sale todo blanco. Esto me lleva a creer queTexIndex está resultando ser un número muy grande (más grande que 256 de todos modos) y que probablemente sea un múltiplo de 16.

Respuestas a la pregunta(2)

Su respuesta a la pregunta