hackferances 2023-10-27 19:42 采纳率: 54.5%
浏览 6
已结题

C++ OpenGL进行纹理操作是出现问题

一段OpenGL代码,预期效果是通过导入stb_image系列的头文件,实现导入图片并改变大小,然后通过OpenGL一个一个像素点轮流输出的方式显示图片。BUG出现在display函数,程序运行后,虽然成功显示了图片,但是实际效果在是一格一格的,我想达到的预期是没有瑕疵的显示图片,想了很久也没想出为什么。

img

我的要求为:如何修改此BUG并输出和原图十分相似的图片。

原图在这:

img


//youtube learning unit3 
#define GLUT_DISABLE_ATEXIT_HACK
#include <windows.h>
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
#define STB_IMAGE_RESIZE_IMPLEMENTATION
#include "old_image_resize.h"

#include <iostream>

#define convert(x) x/256.0 

void display();
void reshape(int,int);

int main(int argc,char **argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(200,100);
    glutInitWindowSize(512,512);
    glutCreateWindow("Texture_practice");
    
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);
    
    glutMainLoop();
    return 0;
}

void display(){
    glClear(GL_COLOR_BUFFER_BIT);
    glLoadIdentity();
    
    int x=512,y=512,n=3;
    unsigned char* idata = stbi_load("container.jpg", &x, &y, &n, 0);
    
    int sub=2;//size of image
    int nx = x / sub;
    int ny = y / sub;
    unsigned char* odata = (unsigned char*)malloc(nx * ny * n);
 
    // 改变图片尺寸
    stbir_resize_uint8(idata, x, y, 0, odata, nx, ny, 0, n);
    glBegin(GL_POINTS);
    
    for (int i=0;i<=nx;i++){
        for (int j=0;j<=ny;j++){
            GLfloat r=odata[(i * nx + j) * n];
            GLfloat g=odata[(i * nx + j) * n + 1];
            GLfloat b=odata[(i * nx + j) * n + 2];
            glColor3f(convert(r),convert(g),convert(b));
            glVertex2f(j-ny/2.0,i-nx/2.0);
        }
    }
    
    glEnd();
    
    stbi_image_free(idata);
    stbi_image_free(odata);
    
    glFlush();
}

void reshape(int w,int h){
    glViewport(0,0,(GLsizei)w,(GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-216,216,-216,216);
    glMatrixMode(GL_MODELVIEW);
    
}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-28 04:27
    关注

    【以下回答由 GPT 生成】

    解决方案

    在你的代码中,你已经成功地导入了图片并将其显示在OpenGL窗口上。然而,由于你的图片尺寸在绘制时进行了变化,导致了显示效果一格一格的问题。为了解决这个问题,我们需要修改两个地方:

    1. 调整OpenGL窗口的大小以适应新的图片尺寸。
    2. 调整绘制新图片的位置和大小,以使其与原图相似。

    以下是修改代码的具体步骤:

    步骤1: 调整OpenGL窗口的大小

    在原始的reshape函数中,我们需要修改glOrthoglViewport的参数,以适应新的图片尺寸。根据你的代码,新图片的尺寸是原始图片的1/2,因此我们将窗口的大小也设置为原始尺寸的1/2。

    void reshape(int w, int h){
        glViewport(0, 0, w/2, h/2);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gluOrtho2D(0, w/2, 0, h/2);
        glMatrixMode(GL_MODELVIEW);
    }
    

    步骤2: 调整绘制新图片的位置和大小

    display函数中,我们需要调整新图片的绘制位置和大小,以使其与原图相似。首先,我们可以根据原始图片的尺寸计算每个像素点的大小,然后根据新图片的尺寸在OpenGL窗口中逐个绘制像素点。

    void display(){
        glClear(GL_COLOR_BUFFER_BIT);
        glLoadIdentity();
    
        int x=512,y=512,n=3;
        unsigned char* idata = stbi_load("container.jpg", &x, &y, &n, 0);
    
        int sub=2; //size of image
        int nx = x / sub;
        int ny = y / sub;
        unsigned char* odata = (unsigned char*)malloc(nx * ny * n);
    
        // 改变图片尺寸
        stbir_resize_uint8(idata, x, y, 0, odata, nx, ny, 0, n);
    
        // 绘制原图
        glRasterPos2i(0, 0);
        glDrawPixels(x, y, GL_RGB, GL_UNSIGNED_BYTE, idata);
    
        // 绘制改变尺寸后的图片
        float pixel_size_x = 2.0f / x;
        float pixel_size_y = 2.0f / y;
        for (int i = 0; i < nx; i++) {
            for (int j = 0; j < ny; j++) {
                glRasterPos2f(x + i * pixel_size_x, j * pixel_size_y);
                glDrawPixels(1, 1, GL_RGB, GL_UNSIGNED_BYTE, &odata[(i + j * nx) * n]);
            }
        }
    
        glFlush();
        free(odata);
        free(idata);
    }
    

    通过这两个步骤的修改,你应该能够得到显示和原图十分相似的图片。记得引用stb_image和stb_image_resize库以确保代码可以正确运行。

    请注意,以上代码只是一个示例,可能需要根据你的具体情况进行进一步调整。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月5日
  • 已采纳回答 10月28日
  • 修改了问题 10月27日
  • 修改了问题 10月27日
  • 展开全部

悬赏问题

  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 易优eyoucms关于二级栏目调用的问题
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件
  • ¥15 为什么eclipse不能再下载了?
  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上
  • ¥15 提问一个关于vscode相关的环境配置问题,就是输入中文但是显示不出来,代码在idea可以显示中文,但在vscode不行,不知道怎么配置环境