2017-01-18 8 views
0

私はOpenGL-ESを使ってアンドロイドで要素を描画するためにこれらの関数を使用します。最初にコンストラクタでバインドした後(つまり、GL10を使用しているため正しくバインドされています)、私はCreateProgram関数を使用してプログラムを作成し、Drawを呼び出します。私は問題が描画機能にあると思います。誰でも私のミスが何であるか教えてくれますか?何も描画しない

PS:G10を使用していると言われているので、私はバッファのバインディングのコードを投稿しません。今はGL20を使いたいのですが、多分私が間違っていますが、静的関数を使用しているため、異なる質問やアンドロイド開発サイトのいくつかのページを読むことはOpenGL-ESが高速です。あなたはフラグメントシェーダの属性を持つことはできません

private final String vertexShader="" + 
      "attribute vec3 vertex; \n" + 
      "void main(){\n" + 
      " gl_Position=vertex;\n" + 
      "}"; 

private final String fragmentShader="" + 
      "attribute vec4 colors;\n" + 
      "void main(){\n" + 
      " gl_FragColor=colors;\n" + 
      "}"; 


public int LoadShader(String shader,int type){ 
    int sha= GLES20.glCreateShader(type); 
    GLES20.glShaderSource(sha,shader); 
    GLES20.glCompileShader(sha); 
    return sha; 
} 

int program=0; 
public void CreateGLProgram() 
{ 
    program=GLES20.glCreateProgram(); 

    GLES20.glAttachShader(program,LoadShader(vertexShader,GLES20.GL_VERTEX_SHADER)); 
    GLES20.glAttachShader(program,LoadShader(fragmentShader,GLES20.GL_FRAGMENT_SHADER)); 

    GLES20.glLinkProgram(program); 
} 

public void DrawShader(){ 
    GLES20.glUseProgram(program); 

    int vertex_handle=GLES20.glGetAttribLocation(program,"vertex"); 
    GLES20.glVertexAttribPointer(vertex_handle,3,GLES20.GL_FLOAT,false,4,coordinatesbuff); 

    int frag_handle=GLES20.glGetAttribLocation(program,"colors"); 
    GLES20.glVertexAttribPointer(frag_handle,4,GLES20.GL_FLOAT,false,4,colorbuffer); 

    GLES20.glDrawElements(GLES20.GL_TRIANGLES,indicies.length,GLES20.GL_UNSIGNED_SHORT,indiciesbuffer); 

    GLES20.glDisableVertexAttribArray(vertex_handle); 
    GLES20.glDisableVertexAttribArray(frag_handle); 
} 

答えて

0

はここで実際にコードのおかげであります。フラグメントシェーダで頂点ごとの色を使用する場合は、この属性を頂点シェーダで定義し、フラグメントシェーダにデータをvaryingで渡す必要があります。フラグメントシェーダで属性を使用すると、コンパイルエラーをトリガする必要があるため

また、あなたはあなたのシェーダが正しく(glGetShaderiv(..., GL_COMPILE_STATUS...とリンク(glProgramiv(..., GL_LINK_STATUS...)をコンパイルしているかどうかを確認する必要があります。これは正しい軌道に乗ってあなたをもたらしたであろう。またglGetErrorをする必要があります。BDLが書いたものに加えて

1

チェック:

あなたはglEnableVertexAttribArray(int型のインデックス)を使用して属性ポインタを有効にする必要があります。

int vertex_handle=GLES20.glGetAttribLocation(program, "vertex"); 
GLES20.glEnableVertexAttribArray(vertex_handle); 
GLES20.glVertexAttribPointer(vertex_handle, 3, GLES20.GL_FLOAT, false, 4, coordinatesbuff); 

int frag_handle=GLES20.glGetAttribLocation(program, "colors"); 
GLES20.glEnableVertexAttribArray(frag_handle); 
GLES20.glVertexAttribPointer(frag_handle, 4, GLES20.GL_FLOAT, false, 4, colorbuffer); 
関連する問題