OpenGL 에서 원하는대로 색상이 출력이 안됩니다..

조회수 1126회

이미지

안녕하세요 OpenGL을 혼자 공부하고 있는 학생입니다. 다름이아니라 지금 OpenGL에서 배열을 정점배열을 이용해서 객체를 만들고 있는데 사진과 같이 저 두 면의 색생이 입혀지질 않습니다.

GLfloat vertecies[] = { -0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, 0.1f, -0.1f, -0.1f, 0.1f, -0.1f,
                        0.1f, -0.1f, 0.1f, 0.1f, 0.1f, 0.1f, -0.1f, 0.1f, 0.1f, -0.1f, -0.1f, 0.1f,
                        0.1f, 0.1f, -0.1f, 0.1f, 0.1f, 0.1f, 0.1f, -0.1f, 0.1f, 0.1f, -0.1f, -0.1f,
                        -0.1f, -0.1f, 0.1f,-0.1f, 0.1f, 0.1f, -0.1f, 0.1f, -0.1f, -0.1f, -0.1f, -0.1f,
                        0.1f, -0.1f, 0.1f, -0.1f, -0.1f, 0.1f, -0.1f, -0.1f, -0.1f, 0.1f, -0.1f, -0.1f,
                        0.1f, 0.1f, -0.1f, 0.1f, -0.1f, -0.1f, -0.1f, -0.1f, -0.1f, -0.1f, 0.1f, -0.1f  }; // Block 정보

GLfloat color[] = { 1,0,0,
                    1,1,0,
                    1,0,0,
                    0,1,0,
                    0,0,1,
                    1,0,1,
                    0,1,1,
                    0.5,0.5,0.5 }; //색상정보

GLubyte index[] = { 0,1,2,3,
                    4,5,6,7,
                    8,9,10,11,
                    12,13,14,15,
                    16,17,18,19,
                    20,21,22,23 }; // 정점의 순서
void Block()
{
        glDrawElements(GL_QUADS,24, GL_UNSIGNED_BYTE, index);   
}

void Draw()
{
    glLoadIdentity();
    glPushMatrix();
        /*** 물체 변환 방식 ***/
        //물체가 전역좌표계의 원점에 이미 그려져있다고 가정하고 전역 좌표계를 기준으로 변환
        glTranslatef(nx, 0.0, 0.0);
        glTranslatef(0.0, ny, 0.0);
        glTranslatef(0.0, 0.0, 0.0);

        glRotatef(xAngle, 1.0f, 0.0f, 0.0f);
        glRotatef(yAngle, 0.0f, 1.0f, 0.0f);
        glRotatef(zAngle, 0.0f, 0.0f, 1.0f);
        /********************/

        Block(); // 육면체 
        //Cylinder();
    glPopMatrix();
}

void Display()
{
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 지정한 색상으로 배경을 지움
    glPolygonMode(GL_FRONT_AND_BACK, GL_QUADS);
    glVertexPointer(3, GL_FLOAT, 0, vertecies);
    glColorPointer(3, GL_FLOAT, 0, color);
    glShadeModel(GL_FLAT);
    Draw();
    glFlush();
    // 버퍼를 비워서 명령을 한번에(즉시) 실행
}

void Init() // 메인에서 메시지 루프 들어가기전 단 한번만 초기화, 초기화만 하는 함수
{
    glClearColor(1.0, 1.0, 1.0, 0.0); // 배경 색상 지정 - 디폴트 검정색
    glEnable(GL_DEPTH_TEST);
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    /*
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
//  glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, light_direction);
    glLightfv(GL_LIGHT0, GL_AMBIENT, light_amibient);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
    */
}


void main(int argc, char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 이중버퍼 | glut가 사용하는 기본색상모드 | 깊이 버퍼
    glutInitWindowPosition(0, 0); // 실행시 윈도우 창이 열리는 위치
    glutInitWindowSize(500, 500); // 윈도우 작업장 크기 영역 설정,창의 크기 X
    glutCreateWindow("Graphics Lego Project");
    glutKeyboardFunc(Keyboard);
    glutSpecialFunc(SpecialKey);

//  glutMotionFunc();
//  glutPassiveMotionFunc();
    glutDisplayFunc(Display);
    Init();
    glutMainLoop();
}

소스를 보시면 아시다시피 칼라 배열에 검은색을 제가 넣지 않았습니다.. 그런데도 지금 검은색 면이 두개가 출력이 되고있는데, 어디가 문제인지 잘모르겠습니다. 예상 되는 문제는 Block 함수밖에 없다고 생각하는데 제 실력으로는 문제가 있어보이지는 않습니다.. 어디가 잘못되었나요?

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    index를 사용하시려면 vertex를 재사용하는 목적이 되어야 하는데

    일단 vertex 구성을 보니 재사용하는게 아니고 (육면체의 각 면을 이루는 네 점) * 6 해서 24개를 구성하신 것 같네요.

    일단 버택스 구성을 그렇게 하셨으니 만약 버텍스-인덱스 구성을 바꾸실게 아니라면 컬러도 정점(버택스)의 갯수만큼 24개를 만들어야 합니다.

    • 감사합니다. 그런데 컬러를 24개만큼 구성을하면, 면의 색상은 어떤 정보를 기준으로 입혀지나요?한면에 정점은 4개인데 컬러를 정점갯수만큼 설정을하면, 색상정보도 4개인데 어떤 기준인가요? codeslave 2018.11.28 19:47
    • 정점 사이의 색은 각 정점이 가지고 있는 색상을 기준으로 보간됩니다. FS에서는 VS에서 구셩한 Quad 정보 (점 4개)의 색상으로 그것이 이루는 면의 색을 보간하는거죠. 공부하시다가 많이 보셨을 겁니다. http://www.lighthouse3d.com/tutorials/glsl-tutorial/color-example/ 이렇게 색이 입혀진 큐브요 doodoji 2018.11.28 20:01
    • 따라서 한 면을 같은색으로 칠하려면 한 면을 이루는 버텍스들은 같은 색상을 가져야 하죠. doodoji 2018.11.28 20:02
    • 점에 색상을 실어 보낸다고 생각하시면 편합니다. doodoji 2018.11.28 20:06
    • 감사합니다. 그런데 제가 말씀드리고자하는 바는 그 SMOOTH 방법말고 FLAT으로 그러니까..단일 색상으로 면의 색을 입힐때를 말씀드리는거였습니다 ㅠ codeslave 2018.11.28 20:13
    • 아.. flat이군요. 보통 하나의 폴리곤을 구성할 때, 마지막 정점의 색상으로 들어가지 않나요? 잘모르겠네요 doodoji 2018.11.28 20:29

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)