シェーダー コード:
#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 つの方法があります。
- シェーダーで sampler2DRect を使用するだけです。( コメント sampler2D )
コメント
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を使用しています