2016-11-24 22 views
0

OpenGles 2.0で必要なものを達成するためには本当に悪夢があります コードリファレンスを投稿する前に、必要なものを教えてください。複数のシェーダプログラムを切り替える(OpenGL-ES 2.0で)

私は2Dテクスチャフラグメントシェーダを持っています。テクスチャの上に赤い線を描きたい。私は線を描くことができるが、赤に着色することは機能していない。

シェーダ宣言:テクスチャの上に

static const char s_v_shader[] = 
    "attribute vec4 vPosition; \n" 
    "attribute vec2 my_Texcoor;  \n" 
    "uniform mat4 u_TransMatrix; \n" 
    "varying vec2 vTexcoor;   \n" 
    "void main() \n" 
    "{ \n" 
    " vTexcoor = my_Texcoor;  \n" 
    " gl_Position = u_TransMatrix*vPosition; \n" 
    "} \n"; 

    static const char s_f_shader[] = 
    "precision mediump float;\n" 
    "uniform sampler2D my_Sampler;     \n" 
    "varying vec2 vTexcoor;       \n" 
    "void main() \n" 
    "{ \n" 
    " vec4 tex = texture2D(my_Sampler, vTexcoor); \n" 
    " gl_FragColor = tex;       \n" 
    "} \n"; 

私は無限ループにカメラからビデオフレームをレンダリングしています。 ビデオをレンダリングする前に、2Dテクスチャの座標を下のコードで設定しています。

今私は天才の人々のほとんどは、上記のように1つの以上のシェーダを宣言したが、均一vec4色で均一sampler2D my_Samplerを交換することが示唆

main() 

    { 
    const GLfloat vertices[][2] = { 
     { -1.0f, -1.0f}, 
     { 1.0f, -1.0f}, 
     { -1.0f, 1.0f}, 
     { 1.0f, 1.0f} 
    }; 

    const GLfloat texcoords[][2] = { 
     { 0.0f, 1.0f}, 
     { 1.0f, 1.0f}, 
     { 0.0f, 0.0f}, 
     { 1.0f, 0.0f} 
    }; 
    GLfloat transformMatrix[16] = 
    { 
     1.0f, 0.0f, 0.0f, 0.0f, 
     0.0f, 1.0f, 0.0f, 0.0f, 
     0.0f, 0.0f, 1.0f, 0.0f, 
     0.0f, 0.0f, 0.0f, 1.0f 
    }; 

     // setup OpenGl environment...... 
     Setup_coordinates() 

    } 

    Setup_coordinates() 
    { 
     LoadShaders(s_v_shader, s_f_shader); 

-- Complete function defined below 
     // By now I should be using shader program. 

     // Grab location of shader attributes. 


    GLint locVertices = glGetAttribLocation(programHandle, "vPosition"); 
       GLint locTexcoord = glGetAttribLocation(programHandle, "my_Texcoor"); 

      // Transform Matrix is uniform for all vertices here. 
       GLint locTransformMat = glGetUniformLocation(programHandle, "u_TransMatrix"); 
       GLint locSampler = glGetUniformLocation(programHandle, "my_Sampler");  

      /* Create the texture. */ 
       glGenTextures(1, &gTexObj); 
       glBindTexture(GL_TEXTURE_2D, gTexObj); 
       if (gTexObj == 0) 
       { 
        printf("Could not load the texture \n"); 
        return -1; 
       } 

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

       glUniformMatrix4fv(locTransformMat, 1, GL_FALSE, transformMatrix); 

       glUniform1i(locSampler, 0); 

       glClearColor(0.0f, 0.5f, 0.0f, 0.0f); 
       glClear(GL_COLOR_BUFFER_BIT); 


      while(1) -- Infinite loop to render video frames on 2D texture and draw red color line. 
      { 
       // enable vertex arrays to push the data. 


    glEnableVertexAttribArray(locVertices); 
       glEnableVertexAttribArray(locTexcoord); 

       // set data in the arrays. 
       glVertexAttribPointer(locVertices, 2, GL_FLOAT, GL_FALSE, 0, &vertices[0][0]); 
       glVertexAttribPointer(locTexcoord, 2, GL_FLOAT, GL_FALSE, 0, &texcoords[0][0]); 

      Render video frames logic goes here................................... 
      Each frame of video is abosultely rendering fine. 

      glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

     Now comes the tricky part to draw the line and color it with red. 



float red_left_1[] = 
    { 
     -0.85f, -0.9f, -0.6f, -0.5f, 
    }; 
     glVertexAttribPointer (1, 2, GL_FLOAT, GL_FALSE, 0, red_left_1); 
     glEnableVertexAttribArray (1); 

     glDrawArrays (GL_LINES , 0, 2); 
     glLineWidth(width_test); 

     } 

     } 



void LoadShaders(const char * vShader, const char * pShader) 
    { 
     vertShaderNum = glCreateShader(GL_VERTEX_SHADER); 
     pixelShaderNum = glCreateShader(GL_FRAGMENT_SHADER); 

     if (CompileShader(vShader, vertShaderNum) == 0) 
     { 
      printf("%d: PS compile failed.\n", __LINE__); 
      return; 
     } 

     if (CompileShader(pShader, pixelShaderNum) == 0) 
     { 
      printf("%d: VS compile failed.\n", __LINE__); 
      return; 
     } 

     programHandle = glCreateProgram(); 

     glAttachShader(programHandle, vertShaderNum); 
     glAttachShader(programHandle, pixelShaderNum); 

     // Bind vPosition to attribute 0 
     glBindAttribLocation (programHandle, 0, "vPosition"); 

     glLinkProgram(programHandle); 
     // Check if linking succeeded. 
     GLint linked = 0; 
     glGetProgramiv(programHandle, GL_LINK_STATUS, &linked); 
     if (!linked) 
     { 
      printf("%d: Link failed.\n", __LINE__); 
      // Retrieve error buffer size. 
      GLint errorBufSize, errorLength; 
      glGetShaderiv(programHandle, GL_INFO_LOG_LENGTH, &errorBufSize); 

      char * infoLog = (char*)malloc(errorBufSize * sizeof (char) + 1); 
      if (infoLog) 
      { 
       // Retrieve error. 
       glGetProgramInfoLog(programHandle, errorBufSize, &errorLength, infoLog); 
       infoLog[errorBufSize + 1] = '\0'; 
       fprintf(stderr, "%s", infoLog); 

       free(infoLog); 
      } 

      return; 
     } 
     glClearColor(0.0f, 0.0f, 0.0f, 0.0f); 
     glUseProgram(programHandle); 
    } 

メイン関数からの私のコードを説明します。

void main() 
    { 
    gl_FragColor = color 
    } 

次に、glUseProgramを使用してテクスチャと描画色の線を表示しながら、これらのシェーダプログラムを切り替えます。

私は、線を描くシェーダプログラムへの切り替えが機能していないので、絶対にやめました。

+0

赤いテクスチャ(1つの赤いピクセルで1x1)を生成し、その線を描画するときに切り替えると考えましたか? – david

+0

@Davidいいえ私はそれを試していない。あなたはそれを行うためにコードスニペットを投稿できますか? –

答えて

0

ここでは、ラインに使用できる色付きの1x1テクスチャを生成するためのコードです(mainまたはSetup_coordinatesに入ります)。このソリューションでは、別のシェーダは必要ありません。

GLuint lineTexture; 
glGenTextures(1, &lineTexture); 
unsigned char red[4] = { 255, 0, 0, 255}; 
glBindTexture(GL_TEXTURE_2D, lineTexture); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, red); 
glBindTexture(GL_TEXTURE_2D, 0); 

glDrawArraysを呼び出す前に、これを使用して正しいテクスチャに切り替えます。

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, <lineTexture or gTexObj>); 
glUniform1i(locSampler, 0); 

より一般的な解決策は、(私は個人的に私のOpenGLのプロジェクトに実装すること)、白のテクスチャを作成し、あなたのシェーダに色の制服を追加しにTexture2D戻り値で制服を掛けることです。この方法では、同じ白いテクスチャから異なる色の線とグラフィックスを作成し、色の均一性のみを変更することができます。ビデオフレームの場合は、白色で送信し、ピクセルは変更されません。これはあなたのコードの変更をほとんど必要としませんが、それがより良いと思うなら、あなたはそれを理解することができます。 :)

+0

ありがとうございました。あなたは素晴らしいです。あなたは天才です。あなたのロジックは機能しました! 。あなたのロジックで、私は色付きの線を描くことができました.1つの最後の質問は、どのように黄色の線を描くことができますか? –

+0

カラーユニフォームソリューションを使用したい場合は、赤(RGB)の代わりに黄色(1.f、1.f、0.f、1.f)または(255,255,0,255)のRGBA値を送信してください。 。そうでない場合は、最初のスニペットをコピーし、赤の配列値を変更します。 :) – david

+0

はいトリックをしたデビッド。もう一度トンに感謝します。 –

関連する問題