2012-02-04 9 views
1

...フロートがうまく出てきているように見えますが、intに問題があります。floatとintの両方を同じ配列バッファにパックすることはできますか?

本質的に私はvec3intを保持する "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

+1

「GLSLは整数演算を行いますか?intを整数で割った整数が整数として出力されますか?」はい。 –

+0

@NicolBolas:ありがとう!ちょうど確かめたかった。 – mpen

答えて

4
layout (location = 4) in int TexIndex; 

の倍数だとされていることを信じるように私をリード。

glVertexAttribPointerは、浮動小数点値に変換されるデータを送信するために使用されます。これは、浮動小数点の属性を供給するために使用されます。整数を渡すことは可能ですが、それらの整数は浮動小数点数に変換されます。なぜなら、それはglVertexAttribPointerのためです。

glVertexAttribIPointer(通知はです)です。これは、符号付きおよび符号なしの整数データを提供するために使用されます。

したがって、頂点シェーダー入力をfloatまたはそれ以外のプレフィックス付きvecとして宣言する場合は、glVertexAttribPointerを使用します。入力をintuint,ivecまたはuvecと宣言する場合は、glVertexAttribIPointerを使用します。

+0

優秀!今すぐ動作します。それを考えなかっただろうか。 OpenTKの 'VertexAttribPointerType' enumはIntの型を持っていますので、関数はIntを受け入れると考えました。明らかにそうではありません! – mpen

+1

@マーク:この関数はintをうまく受け入れます。 GLSLが消費するためには単にfloat *に変換することが期待されます。つまり、属性に 'float'または' vec'型を使用することを期待しています。あなたがしようとしているのは、intからfloatへの変換ではなく、整数を*整数*として渡すことです。これには 'Pointer'ではなく' IPointer'を使う必要があります。 –

関連する問題