프로그래밍 언어/OpenGL

[OpenGL] 이미지 출력하기

sujo 2021. 11. 1. 00:06

[OpenGL] 이미지 출력하기

* 코딩 환경 Visual Studio 2019

 

파일 로드를 위한 헤더

이미지를 읽어오기 위해 아래 깃허브에서 헤더를 다운로드한다.

여기서 우리는 stb_image.h를 사용할 것이다.

https://github.com/nothings/stb/blob/master/stb_image.h

 

GitHub - nothings/stb: stb single-file public domain libraries for C/C++

stb single-file public domain libraries for C/C++. Contribute to nothings/stb development by creating an account on GitHub.

github.com

 

- 사용가능한 파일 확장자 : JPG, PNG, TGA, BMP, PSD, GIF, HDR, PIC

- 이미지 크기는 상관없음

 

다운로드한 헤더 파일은 소스코드에 알아서 잘 넣도록 하자.

- 속성에서 추가 디렉터리로 연결해주던가

- 아님, 헤더 파일 폴더에 추가하기

 

해당 헤더를 사용하기 위해서는 아래와 같이 define이 필요함. (중요)

1
2
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
cs

 

 

사용한 이미지

 

전에 쏘롱 하면서 jiychoi가 그려준 으썸한 벽돌 이미지...

킹갓제너럴금손 지최 존경합니다 ㅎㅎ

 

 

전체 소스 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <iostream>
#include <GL/glut.h>
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
using namespace std;
 
// image width and height
int width, height;
 
//이미지 파일 열기
unsigned char* LoadMeshFromFile(const char* texFile)
{
    GLuint texture;
    glGenTextures(1&texture);
    FILE* fp = NULL;
    if (fopen_s(&fp, texFile, "rb")) {
        printf("ERROR : No %s. \n fail to bind %d\n", texFile, texture);
        return (unsigned char*)false;
    }
    int channel;
    unsigned char* image = stbi_load_from_file(fp, &width, &height, &channel, 4);
    fclose(fp);
    return image;
}
 
// texture 설정
void init()
{
    GLuint texID;
 
    unsigned char* bitmap;
    bitmap = LoadMeshFromFile((char*)"block.png");
    glEnable(GL_TEXTURE_2D);
    glGenTextures(1&texID);
    glBindTexture(GL_TEXTURE_2D, texID);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, bitmap);
 
    //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    free(bitmap);
}
 
void drawBox()
{
    glBegin(GL_POLYGON);
    glTexCoord2d(0.01.0);      glVertex3d(-0.5-0.50.0);
    glTexCoord2d(0.00.0);      glVertex3d(-0.50.50.0);
    glTexCoord2d(1.00.0);      glVertex3d(0.50.50.0);
    glTexCoord2d(1.01.0);      glVertex3d(0.5-0.50.0);
    glEnd();
}
 
void display()
{
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    
    drawBox();
 
    glutSwapBuffers();
}
 
void reshape(GLint w, GLint h) {
    glViewport(00, w, h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-1.01.0-1.01.0-1.030.0);
}
 
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(500500);
    glutInitWindowPosition(100100);
    glutCreateWindow("image");
    glutReshapeFunc(reshape);
    init();
 
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}
 
 
cs

 

[ 출력 결과 ]

 

* 주의사항

- 이미지 한 개만 있을 때를 가정하고 코딩한 거라 여러 이미지를 넣고 싶다면 texID를 배열로 바꿔야 하고..

- glGenTextures 인자도 바꿔줘야 함.

- 물론 전역 변수로 설정한 width나 height도 수정 들어가야 함.

- 이 글은 이미지를 출력해보는데 의의가 있으므로 거기까진 안 함.