...フロートがうまく出てきているように見えますが、intに問題があります。floatとintの両方を同じ配列バッファにパックすることはできますか?
本質的に私はvec3
とint
を保持する "BlockInstance"という構造体を持っています。私は私が(明確にするためのC#からCへの変換)のようにバッファこれらBlockInstancesの配列持っている:
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);
をそして、私の頂点シェーダは、次のようになります。私はTexIndex
を交換するとき
#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シェーダの最後の行で、0,1,2のような定数を使って、テクスチャはうまくいきますが、私がそれをそのまま残してしまうと、それらはすべて乱されてしまいます。そのため、右?しかし、何が出てくるのか分からないので、デバッグは難しいです。
私はそれが他に何をすることができ...ので、私は私の入力が間違っているとは思わない
をBlockInstancesの私の配列を見てきました、そして、彼らはすべての1,2、または19に設定されていますか?
私はタイルのそれぞれは、16×16ピクセルであるが、私の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
「GLSLは整数演算を行いますか?intを整数で割った整数が整数として出力されますか?」はい。 –
@NicolBolas:ありがとう!ちょうど確かめたかった。 – mpen