2016-12-12 7 views
1

私はiOSデバイスでGPGPUプログラミングをしようとしていますが、OpenGL ES 3.0環境の設定方法に関する情報はありません。私はフラグメントシェーダで計算を行う方法を理解していますが、フロート配列をフラグメントシェーダの一様なサンプラ変数に渡すことはできません。OpenGL ESで浮動小数点配列をテクスチャに渡す方法は?

この私がFBOを設定する方法で、CPUにメモリを割り当てる:ここ

float** dens = (float**) malloc(W*sizeof(float*)); 
for (int i = 0; i < W; i++) { 
    dens[i] = (float *)malloc(H*sizeof(float)); 
} 

// input value 
for (int i = 0; i < W; i++) { 
    for (int j = 0; j < H; j++) { 
     dens[i][j] = 1.0f; 
    } 
} 

GLuint FBO; 
glGenFramebuffers(1, &FBO); 
glBindFramebuffer(GL_FRAMEBUFFER, FBO); 

GLuint dens_gl = load_texture(W, H, GL_RGBA, 0, dens); 

glBindFramebuffer(GL_FRAMEBUFFER, 0); 

がload_textureための私のコードです:

GLuint load_texture(const GLsizei width, const GLsizei height, const GLenum type, int tex_number, const float** data) { 

GLuint texture_object_id; 
glGenTextures(1, &texture_object_id); 
assert(texture_object_id != 0); 
glActiveTexture(GL_TEXTURE0 + tex_number); 
glBindTexture(GL_TEXTURE_2D, texture_object_id); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

glTexImage2D(GL_TEXTURE_2D, 0, type, width, height, 0, type, GL_UNSIGNED_BYTE, data); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + tex_number, GL_TEXTURE_2D, texture_object_id, 0); 

if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE){ 
    NSLog(@"failed to make complete framebuffer objects %x", glCheckFramebufferStatus(GL_FRAMEBUFFER)); 
} 

glBindTexture(GL_TEXTURE_2D, 0); 

return texture_object_id; 
} 

と私のfragmentshader.fsh:

uniform vec2 uResolution; 
uniform vec2 aPosition; 
uniform sampler2D dens_gl; 

void main(void) { 
vec2 uv = aPosition.xy/uResolution.xy; 
gl_FragColor = texture2D(dens_gl, uv); 
} 

エラーコードはありませんが、黒い画面しか見ることができず、値を1に設定したために白い画面が表示されます。 CPUメモリに格納されます。どこで私は間違えましたか?

+0

あなたは何をしようとしていますか?フレームバッファの設定コードを表示しますが、テクスチャをどのように動作させるかについての質問があるようです。これらの2つのことはお互いに関係ありません。 – BDL

+0

@BDL私は、フラグメント浮動小数点データにCPU浮動小数点配列データを入力しようとしていますが、セットアップがうまくいきません。内部フォーマットをGL_R32F、フォーマットをGL_RED、タイプをGL_FLOATに変更しようとしたときにGL_INCOMPLETE_ATTACHMENTを与えてくれたので、FBOコードを示しました。上記のコードはエラーなく動作しますが、私のiOSデバイスにはまだ黒い画面が表示されます。 –

答えて

1

テクスチャは、2D配列(つまり、列と行の1つの連続したメモリブロック)です。あなたは1D配列のリストをアップロードしています.1D配列はそれぞれが動的に別々に割り当てられるため、メモリに分散して格納されています。あなたがここでアップロードすることを実際に管理しているかどうかは分かりませんが、ただクラッシュするのは幸運です。

アップロードしようとしているRGBA8テクスチャは、テクセルあたり0〜255の4つの別々のバイト値を格納します(1つは赤、1つは青など)。ピクセルごとに浮動小数点数をアップロードしようとしているため、間違ったデータ形式になっています。

"位置"のユニフォームはすべてのピクセルで一定になるので、すべてのピクセルが同じテクスチャ座標からルックアップすることになります。これはおそらくあなたが望むものではありません。テクスチャ座標を頂点ごとに変化する値としてアップロードする必要があります。

正直言って、ここには多くの根本的な間違いがあります。私は基本的な「テクスチャ三角形」のチュートリアルから始めることをお勧めします。

+0

私の説明が不十分で申し訳ありませんが、私は属性変数として位置を設定しましたが、表示するのを忘れました。これは私のCファイルにあります: _aPosition = glGetAttribLocation(_program、 "aPosition"); と私のvsh。 : 属性vec2 aPosition; void main(void){ gl_Position = vec4(aPosition、0.、1.); } また、CPU入力データをmalloc(W * H * sizeof(float))に変更し、内部形式をGL_R32Fに変更し、書式をGL_REDに設定し、GL_FLOATを入力しました。しかし、私はまだGL_INCOMPLETE_ATTACHMENTエラーが発生します。問題を解決する方法について何か提案がありますか?返信いただきありがとうございます! –

+0

浮動小数点レンダーターゲットは、ES 3.0のコア仕様の一部ではないため、使用しているGPUがこれをサポートしていない可能性があります。 – solidpixel

+0

あなたの質問はテクスチャについてのみ述べていますが、レンダーターゲットを設定するための多くの努力が必要です.2つは同じものではありません。 FBOの一部ではない浮動小数点テクスチャ(これはES3.0ではコア)を読み取ることができます。あなたは1つにレンダリングすることはできません。 – solidpixel

関連する問題