0

シェーダー コード:

#extension GL_ARB_texture_rectangle : enable

uniform sampler2D tex0;
uniform sampler2DRect tex1;
uniform int sampler_type;

void main(void){

    vec4 col;

    if ( sampler_type == 0 ){
        // comment this line - works
        col = texture2D(tex0, gl_TexCoord[0].st);
        //col = texture2D(tex0, gl_TexCoord[0].st/vec2(400, 300));

    }
    else{
        col = texture2DRect(tex1, gl_TexCoord[0].st);
    }
    gl_FragColor = col;
}

メインコード:

void drawQuad(int x, int y, int w, int h, float s, float t)
{

    glBegin(GL_QUADS);
    glTexCoord2f(0, 0);     glVertex2f(x, y);
    glTexCoord2f(s, 0);     glVertex2f(x+w, y);
    glTexCoord2f(s, t);     glVertex2f(x+w, y+h);
    glTexCoord2f(0, t);     glVertex2f(x, y+h);
    glEnd();

}

//--------------------------------------------------------------
void setup(){
    shader.setupShaderFromFile(GL_FRAGMENT_SHADER, "test.frag");
    shader.linkProgram();

    img.loadImage("1.jpg");  // DEFAULT loaded in GL_TEXTURE_RECTANGLE

    GLuint tid;
    glGenTextures(1, &tid);

    glEnable(GL_TEXTURE_2D);

    glBindTexture(GL_TEXTURE_2D, tid);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, 16*16, 16*16, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, 0);  // init to black...

    // if i comment this 2 line everything work
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

    glDisable(GL_TEXTURE_2D);


}

//--------------------------------------------------------------
void draw(){

    shader.begin();
    shader.setUniform1i("sampler_type", 1);// use GL_TEXTURE_RECTANGLE
    //shader.setUniformTexture("tex1", img.getTextureReference(), 0);

    //glActiveTexture(GL_TEXTURE0);
    //glEnable(GL_TEXTURE_RECTANGLE_ARB);
    glBindTexture(GL_TEXTURE_RECTANGLE_ARB, img.getTextureReference().texData.textureID);
    //glDisable(GL_TEXTURE_RECTANGLE_ARB);
    shader.setUniform1i("tex1", 0);
    //glActiveTexture(GL_TEXTURE0);
    drawQuad(0, 0, ScrWidth, ScrHeight, ScrWidth, ScrHeight);
    shader.end();

}

別のテクスチャを作成すると、このシェーダーが機能しなくなる理由がわかりません。

このシェーダを機能させるには 2 つの方法があります。

  1. シェーダーで sampler2DRect を使用するだけです。( コメント sampler2D )
  2. コメント

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

この問題を明確に説明したことを願っています:(私のプラットフォームはWIN7、VS2012で、openFrameWorks 0.7.4を使用しています

4

1 に答える 1

0

申し訳ありませんが、これは混乱です。

  • クワッドを描画する関数を宣言していますが、どこでも使用していません。
  • すべてが setup() 内に描画されます。openFrameworks で OpenGL がどのように実装されているかはよくわかりませんが、専用の draw() 関数があるのはこのためです。
  • genpfault が言ったように #version がありません
  • 非常に使いやすい関数にラップされているため、直接 OpenGL 関数を使用する理由はありません。

私は意地悪なことはしたくありませんが、直接的な答えの代わりに、OFの人から 直接、この詳細なチュートリアルをお勧めします.

于 2013-11-17T20:44:39.727 に答える