生成一个纹理使着色器不起作用

时间:2013-03-21 07:36:39

标签: opengl shader openframeworks

着色器代码:

#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();

}

我不知道为什么我创建另一个纹理会使这个着色器不起作用。

有两种方法可以使这个着色器工作。

  1. 在我的着色器中使用sampler2DRect。 (评论sampler2D)
  2. 评论

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

  3. 希望我已经清楚地描述了这个问题:( 我的平台是WIN7,VS2012,并使用openFrameWorks 0.7.4

1 个答案:

答案 0 :(得分:0)

对不起,这太乱了。

  • 您正在声明绘制四边形的功能,但不在任何地方使用它。
  • 一切都在setup()中绘制。我不确定OpenGL如何在openFrameworks中实现,但是专用的draw()函数就是出于这个原因。
  • 像genpfault说的那样缺少#version
  • 没有理由使用直接的OpenGL函数,因为它们包含在非常易于使用的函数中。

我不想做出吝啬或任何其他事情,而是直接回答,我推荐this detailed tutorial,直接来自OF人。