c - 具有不需要的颜色的纹理

标签 c opengl textures glut

我正在尝试学习如何在 OpenGL 中使用纹理。我没有安装 freeimage,所以我不得不使用 for 循环创建位图。
我想要做的是简单地获取一个包含所有红点的纹理,并将其映射到一个正方形内:

#import <OpenGL/OpenGL.h>
#import <GLUT/GLUT.h>
#import <stdlib.h>
#import <string.h>
#import <math.h>


GLuint texture;
GLfloat (*pixels) [3];

void init()
{

    // Inizializzazione

    glEnable(GL_DEPTH_TEST);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, 1, 1, 1000);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0, 0, -100, 0, 0, 0, 0, 1, 0);

    // Inizializzazione della texture

    glGenTextures(1, &texture);

    pixels= malloc(256*256*sizeof(GLfloat[3]));

    for(GLuint i=0; i<256*256;i++)
    {
        pixels[i][0]=1.0;
        pixels[i][1]= pixels[i][2]= 0.0;
    }

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, GL_RGB, GL_FLOAT, pixels);

}

void display()
{
    glClearColor(0, 0, 0, 0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, texture);

    glPushMatrix();
    glBegin(GL_QUADS);
    glVertex3f(0, 0, 0);
    glTexCoord2f(0.0, 0.0);
    glVertex3f(10, 0, 0);
    glTexCoord2f(0.0, 1.0);
    glVertex3f(10, 10, 0);
    glTexCoord2f(1.0, 1.0);
    glVertex3f(0, 10, 0);
    glTexCoord2f(0.0, 1.0);
    glEnd();
    glPopMatrix();

    glDisable(GL_TEXTURE_2D);

    glutSwapBuffers();
}


int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(600, 600);
    glutCreateWindow(argv[0]);
    glutDisplayFunc(display);
    init();
    glutMainLoop();
    free(pixels);
    return 0;
}

问题是所有像素都是红色的,但我得到的是白色方 block 而不是红色方 block :

enter image description here

最佳答案

你需要在上传数据之前绑定(bind)纹理,所以在 glTexImage2D 之前使用 glBindTexture。此外,就目前而言,纹理将是不完整的,因为它没有 mipmap,并且缩小和放大过滤器的默认值需要它们。使用 glTexParameter 将过滤器设置为线性,或以其他方式创建 mipmap。

关于c - 具有不需要的颜色的纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13625344/

上一篇:c - C 中的输出

下一篇:填充数组时崩溃

相关文章:

c - 缓冲区溢出向后流动?

c - 通过mmap写入文件,但是当我使用fread时,第二次读取错误数据

我可以在我的 C 程序中使用 OpenGL 进行图形处理吗?

c++ - 具有多个着色器程序的 OpenGL 多纹理

opengl - 纹理缓冲对象还是常规纹理?

有人可以解释一下我不断收到的 "expression must be a modifiable lvalue"错误吗?

c - 更新一个文件记录

opengl - 添加到 GLuint 属性索引有什么作用?

WebGL 中的视频纹理不起作用

c++ - 程序从IDE运行时找不到图像目录,但从文件夹运行时可以吗?