Opengl 为什么下面的代码没有';不给一个纯红色的图像?

Opengl 为什么下面的代码没有';不给一个纯红色的图像?,opengl,Opengl,这是我精确代码的简化版本 我希望看到所有红色(因为我只将红色设置为255,将其他设置为0),但实际上得到了以下结果: #include <GLUT/glut.h>

这是我精确代码的简化版本

我希望看到所有红色(因为我只将红色设置为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;
}                  

#包括
静态胶合纹理;
空洞重塑(整数w,整数h){
glViewport(0,0,w,h);
glMatrixMode(GL_投影);
glLoadIdentity();
格洛托(-2,2,-2,2,-2,2);
glMatrixMode(GLU模型视图);
glLoadIdentity();
}
静态无效回调(无符号字符*数据、长宽、长高){
glGenTextures(1,&纹理);
glBindTexture(GL_TEXTURE_2D,纹理);
//glTexEnvi(GL_纹理环境、GL_纹理环境模式、GL_调制);
glTexParameterf(GL_纹理2D,GL_纹理最小过滤器,GL_最近);
glTexParameterf(GL_纹理2D,GL_纹理MAG_过滤器,GL_最近);
glTexParameterf(GL_纹理2D、GL_纹理包裹、GL_夹具);
glTexParameterf(GL_纹理、GL_纹理、GL_包裹、GL_夹紧);
int i,j;
对于(i=0;i
我做错了什么

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
这是你的问题。这是一个常见但微妙的错误

您告诉OpenGL您将提供包含三个组件的颜色数据:R、G和B。您说每个组件的大小都是一个
无符号字节

但你也告诉了OpenGL一些别的东西。函数调用中未提及的内容。即。默认行对齐方式为4。这意味着OpenGL将假定每行的字节宽度将被填充为四个字节

这一点特别重要,因为您的行宽度是350。每像素350*3字节等于1050字节。它不能被四整除。这意味着OpenGL将假定每行占用1052字节。因此,颜色错误;这就是模式重复的原因。这也是为什么在右上角有垃圾像素(因为OpenGL将第一行放在底部,所以它从内存中读取顶部几个像素的垃圾)

每当上传像素数据时,您都需要设置对齐方式(主要是为了确保它设置为您需要的位置)。这是通过以下方式完成的:

这将行对齐设置为1。本质上,它是不对齐的

或者,您可以简单地上传GL_RGBA数据,该数据将始终是4字节对齐的。那你就不用担心了

这是你的问题。这是一个常见但微妙的错误

您告诉OpenGL您将提供包含三个组件的颜色数据:R、G和B。您说每个组件的大小都是一个
无符号字节

但你也告诉了OpenGL一些别的东西。函数调用中未提及的内容。即。默认行对齐方式为4。这意味着OpenGL将假定每行的字节宽度将被填充为四个字节

这一点特别重要,因为您的行宽度是350。每像素350*3字节等于1050字节。它不能被四整除。这意味着OpenGL将假定每行占用1052字节。因此,颜色错误;这就是模式重复的原因。这也是为什么在右上角有垃圾像素(因为OpenGL将第一行放在底部,所以它从内存中读取顶部几个像素的垃圾)

每当上传像素数据时,您都需要设置对齐方式(主要是为了确保它设置为您需要的位置)。这是通过以下方式完成的:

这将行对齐设置为1。本质上,它是不对齐的

或者,您可以简单地上传GL_RGBA数据,该数据将始终是4字节对齐的。那你就不用担心了

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);