1

これは私の正確なコードの簡略化されたバージョンです。

すべての赤が表示されることを期待していますが (赤のみを 255 に、その他を 0 に設定しているため)、実際には次のようになりました。

ここに画像の説明を入力

#include <GLUT/glut.h>                                                                                                                                                                                                                                                        

static GLuint texture;
void reshape(int w, int h) {
    glViewport(0, 0, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-2, 2, -2, 2, -2, 2);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}

static void callback(unsigned char *data, long width, long height) {
    glGenTextures(1, &texture);
    glBindTexture(GL_TEXTURE_2D, texture);
    //glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

    int i,j;
    for (i = 0; i < height; i++) {
        for (j = 0; j < width; j++) {
            data[i * 3 * width + 3 * j] = 255;
            data[i * 3 * width + 3 * j + 1] = 0;
            data[i * 3 * width + 3 * j + 2] = 0;
        }
    }

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
    glBindTexture(GL_TEXTURE_2D, 0);
}

void init() {
    glClearColor(0, 0, 0, 0);//RGBA
}

void display() {
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
        glEnable(GL_TEXTURE_2D);
        unsigned char data[3 * 350 * 168];
        callback(data, 350, 168);
        glBindTexture(GL_TEXTURE_2D, texture);
        glBegin(GL_QUADS);
            glTexCoord2f(0, 0);glVertex2f(-2, -2);
            glTexCoord2f(0, 1);glVertex2f(-2, 2);
            glTexCoord2f(1, 1);glVertex2f(2, 2);
            glTexCoord2f(1, 0);glVertex2f(2, -2);
        glEnd();
        glBindTexture(GL_TEXTURE_2D, 0);
        glutSwapBuffers();
}

int main(int argc, char *argv[]) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE|GLUT_DEPTH|GLUT_RGBA);
    glutInitWindowSize(512, 512);
    glutInitWindowPosition(100, 100);
    glutCreateWindow("hello world texture window");
    glutReshapeFunc(reshape);
    glutDisplayFunc(display);
    glutIdleFunc(display);
    init();
    glutMainLoop();
    return 0;
}                  

ここで何が間違っていますか?

4

1 に答える 1

8
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);

あなたの問題があります。これは、微妙ではありますが、よくある間違いです。

OpenGLに、R、G、Bの3つのコンポーネントでカラーデータを提供することを伝えました。各コンポーネントのUNSIGNED_BYTEサイズは同じであると言いました。

しかし、あなたはOpenGLに別のことも話しました。関数呼び出しで言及されていないもの。つまり、ピクセルデータの個々の行の配置。デフォルトの行の配置は4です。これは、OpenGLがすべての行のバイト幅が4バイトにパディングされると想定することを意味します。

行幅が350であるため、これは特に重要です。350*ピクセルあたり3バイトは1050バイトです。これは4で割り切れません。これは、OpenGLが各行が1052バイトを占めると想定することを意味します。したがって、色のねじ込み。これがパターンが繰り返される理由です。また、右上にガベージピクセルが表示されるのもそのためです(OpenGLは最初の行を下に配置するため、メモリからガベージを上数ピクセルで読み取ります)。

ピクセルデータをアップロードするときはいつでも配置を設定する必要があります(ほとんどの場合、必要なものに設定されていることを確認するためだけです)。これはglPixelStoreiで行われます:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

これにより、行の配置が1に設定されます。基本的に、配置されていません。

または、GL_RGBAデータをアップロードするだけでもかまいません。GL_RGBAデータは常に4バイトに揃えられます。そうすれば、それについて心配する必要はありません。

于 2012-08-13T10:02:02.077 に答える