私はテクスチャをよりよく理解するための概念証明プログラムを書いていますが、それは1x1テクスチャでは動作しますが、他のテクスチャではうまく動作しないという奇妙な動作をしています。何度もプログラムをスキャンし、各関数の引数を調べましたが、1x1テクスチャ(または大きなテクスチャの最初のピクセル)では正しく動作する理由は理解できませんが、それ以外の場合は白い四角が表示されます。OpenGL - このプログラムを1x1より大きいテクスチャで動作させるにはどうすればよいですか?
glTexImage2Dの幅と高さの引数(1,1)と(2,2)でそれぞれ実行されている同じプログラムの画像です。
は(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;
}
GL_TEXTURE_MIN_FILTERを設定する正しい属性は何ですか?それに、GL_TEXTURE_MAG_FILTERは、私がこのケースで心配しなければならないことであってはなりません。なぜなら、それは拡大されており、最小化されていないからです。 – Dmitry
これを設定する値ではなく、最初の引数 'target'が間違っています。 – derhass
derp、それはGL_TEXTURE_2Dです。それはそれを解決する。 – Dmitry