2017-11-05 15 views
0

私はテクスチャをよりよく理解するための概念証明プログラムを書いていますが、それは1x1テクスチャでは動作しますが、他のテクスチャではうまく動作しないという奇妙な動作をしています。何度もプログラムをスキャンし、各関数の引数を調べましたが、1x1テクスチャ(または大きなテクスチャの最初のピクセル)では正しく動作する理由は理解できませんが、それ以外の場合は白い四角が表示されます。OpenGL - このプログラムを1x1より大きいテクスチャで動作させるにはどうすればよいですか?

glTexImage2Dの幅と高さの引数(1,1)と(2,2)でそれぞれ実行されている同じプログラムの画像です。 texture width, height -> 2,2

この texture width, height -> 1,1

は(2x2の赤、緑、青、黄色の行の主要なテクスチャを描画することが期待に対し)白四角を示すコードです。

ノートin(Comment, Arg)マクロがArgにequivelentされ、それが唯一のそれはあなたの頭の上からglTexImage2Dの引数を覚えておくことは難しいですので、この特定のプログラムで使われています。

#include <GL/glut.h> 

// | reminder decorator macro. 
#define in(Comment, Arg) Arg 

GLubyte bm[16] = { 
    0xff, 0x00, 0x00, 0xff, 
    0x00, 0xff, 0x00, 0xff, 
    0x00, 0x00, 0xff, 0xff, 
    0xff, 0xff, 0x00, 0xff 
}; 

GLuint tex; 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT);   

    glBindTexture(GL_TEXTURE_2D, tex); 

    glLoadIdentity(); 

    // | make the square smaller to contrast our target from the background. 
    glScalef(.5f, .5f, 1.f); 

    glBegin(GL_TRIANGLE_FAN); 
     glTexCoord2f(0.f, 0.f); 
     glVertex2f(-1.f, 1.f); 
     glTexCoord2f(0.f, 1.f); 
     glVertex2f(1.f, 1.f); 
     glTexCoord2f(1.f, 1.f); 
     glVertex2f(1.f, -1.f); 
     glTexCoord2f(1.f, 0.f); 
     glVertex2f(-1.f, -1.f); 
    glEnd(); 

    glFlush(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE); 
    glutCreateWindow(""); 

    glEnable(GL_TEXTURE_2D);   
    glGenTextures(1, &tex); 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glTexImage2D (
     in(target, GL_TEXTURE_2D), 
     in(level, 0), 
     in(internalFormat, GL_RGBA), 
     in(width, 2), 
     in(height, 2), 
     in(border, 0), 
     in(format, GL_RGBA), 
     in(type, GL_UNSIGNED_BYTE), 
     in(data, bm) 
    ); 
    glTexParameteri(tex, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(tex, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

    glutDisplayFunc(display); 
    glutMainLoop(); 

    return 0; 
} 

Iはin(height, 1)in(width, 1)in(height, 2)in(width, 2)を変更する場合、それは赤い正方形を示し、そして予想通りbm配列の最初の3つの値を変更することは、キューブにこの色をマッピングします。

#include <GL/glut.h> 

// | reminder decorator macro. 
#define in(Comment, Arg) Arg 

GLubyte bm[16] = { 
    0xff, 0x00, 0x00, 0xff, 
    0x00, 0xff, 0x00, 0xff, 
    0x00, 0x00, 0xff, 0xff, 
    0xff, 0xff, 0x00, 0xff 
}; 

GLuint tex; 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT);   

    glBindTexture(GL_TEXTURE_2D, tex); 

    glLoadIdentity(); 

    // | make the square smaller to contrast our target from the background. 
    glScalef(.5f, .5f, 1.f); 

    glBegin(GL_TRIANGLE_FAN); 
     glTexCoord2f(0.f, 0.f); 
     glVertex2f(-1.f, 1.f); 
     glTexCoord2f(0.f, 1.f); 
     glVertex2f(1.f, 1.f); 
     glTexCoord2f(1.f, 1.f); 
     glVertex2f(1.f, -1.f); 
     glTexCoord2f(1.f, 0.f); 
     glVertex2f(-1.f, -1.f); 
    glEnd(); 

    glFlush(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE); 
    glutCreateWindow(""); 

    glEnable(GL_TEXTURE_2D);   
    glGenTextures(1, &tex); 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glTexImage2D (
     in(target, GL_TEXTURE_2D), 
     in(level, 0), 
     in(internalFormat, GL_RGBA), 
     in(width, 1), 
     in(height, 1), 
     in(border, 0), 
     in(format, GL_RGBA), 
     in(type, GL_UNSIGNED_BYTE), 
     in(data, bm) 
    ); 
    glTexParameteri(tex, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(tex, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

    glutDisplayFunc(display); 
    glutMainLoop(); 

    return 0; 
} 

誰かが何が起こっているのか、どうすればこの問題を解決できるか説明できますか?

ソリューション:渡されたglTexParameteriへテックスの代わりに、GL_TEXTURE_2D(サイドノート:とglVertex2fに1.Fするタイプミス1.1)

#include <GL/glut.h> 

// | reminder decorator macro. 
#define in(Comment, Arg) Arg 

GLubyte bm[16] = { 
    0xff, 0x00, 0x00, 0xff, 
    0x00, 0xff, 0x00, 0xff, 
    0x00, 0x00, 0xff, 0xff, 
    0xff, 0xff, 0x00, 0xff 
}; 

GLuint tex; 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT);   

    glBindTexture(GL_TEXTURE_2D, tex); 

    glLoadIdentity(); 

    // | make the square smaller to contrast our target from the background. 
    glScalef(.5f, .5f, 1.f); 

    glBegin(GL_TRIANGLE_FAN); 
     glTexCoord2f(0.f, 0.f); 
     glVertex2f(-1.f, 1.f); 
     glTexCoord2f(1.f, 0.f); 
     glVertex2f(1.f, 1.f); 
     glTexCoord2f(1.f, 1.f); 
     glVertex2f(1.f, -1.f); 
     glTexCoord2f(0.f, 1.f); 
     glVertex2f(-1.f, -1.f); 
    glEnd(); 

    glFlush(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE); 
    glutCreateWindow(""); 

    glEnable(GL_TEXTURE_2D);   
    glGenTextures(1, &tex); 
    glBindTexture(GL_TEXTURE_2D, tex); 
    glTexImage2D (
     in(target, GL_TEXTURE_2D), 
     in(level, 0), 
     in(internalFormat, GL_RGBA), 
     in(width, 2), 
     in(height, 2), 
     in(border, 0), 
     in(format, GL_RGBA), 
     in(type, GL_UNSIGNED_BYTE), 
     in(data, bm) 
    ); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

    glutDisplayFunc(display); 
    glutMainLoop(); 

    return 0; 
} 

solved

答えて

3

、指定しました2x2テクスチャでは、テクスチャはミップマップでは完成しませんが、ミップマッピングミニフィリングフィルタを使用します。あなたが得た結果は、仕様通りの正しい結果です。

あなたの間違いは非ミップマッピングGL_NEARESTフィルタを設定するには、あなたの試みである:

glTexParameteri(tex, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

glTexParameterGL_TEXTURE_2Dだろうテクスチャー結合点ではなく、テクスチャ名を期待します。その結果、この呼び出しはGL_INVALID_ENUMエラーを生成し、その他の効果はありません。

+0

GL_TEXTURE_MIN_FILTERを設定する正しい属性は何ですか?それに、GL_TEXTURE_MAG_FILTERは、私がこのケースで心配しなければならないことであってはなりません。なぜなら、それは拡大されており、最小化されていないからです。 – Dmitry

+0

これを設定する値ではなく、最初の引数 'target'が間違っています。 – derhass

+0

derp、それはGL_TEXTURE_2Dです。それはそれを解決する。 – Dmitry

関連する問題