홈페이지 » 어떻게 » CPU와 GPU가 상호 작용하여 컴퓨터 그래픽을 렌더링하는 방법은 무엇입니까?

    CPU와 GPU가 상호 작용하여 컴퓨터 그래픽을 렌더링하는 방법은 무엇입니까?

    컴퓨터의 CPU (Central Processing Unit) 및 GPU (Graphics Processing Unit)는 컴퓨터를 사용할 때마다 선명하고 반응이 빠른 시각적 인터페이스를 제공합니다. 그들이 어떻게 함께 작동하는지 더 잘 이해하기 위해 계속 읽으십시오..

    ~의 사진 사육장.

    오늘의 질문 및 답변 세션은 Q & A 웹 사이트의 커뮤니티 드라이브 그룹 인 Stack Exchange의 하위 부문 인 수퍼 유저의 도움으로 이루어졌습니다..

    질문

    수퍼 유저 리더 Sathya는 질문을 제기했습니다.

    여기서 OpenGL API를 기반으로 삼각형이있는 Triangle.exe라는 작은 C ++ 프로그램의 스크린 샷을 볼 수 있습니다.

    틀림없이 아주 기본적인 예제지만 다른 그래픽 카드 작업에도 적용 할 수 있다고 생각합니다..

    나는 단지 궁금해서 모니터에서 삼각형이 회전하는 것을 볼 수있을 때까지 Windows XP에서 Triangle.exe를 두 번 클릭하는 것으로부터 전체 프로세스를 알고 싶었습니다. 무슨 일이 일어나고, CPU (처음에는 .exe 처리)와 GPU (최종적으로 화면에 삼각형을 출력)가 어떻게 상호 작용하는지?

    이 회전하는 삼각형을 표시하는 데 관련된 것은 주로 다음과 같은 하드웨어 / 소프트웨어입니다.

    하드웨어

    • HDD
    • 시스템 메모리 (RAM)
    • CPU
    • 비디오 메모리
    • GPU
    • LCD 디스플레이

    소프트웨어

    • 운영 체제
    • DirectX / OpenGL API
    • 엔비디아 드라이버

    누구나 프로세스를 설명 할 수 있습니까, 어쩌면 일러스트레이션을 위해 일종의 흐름 차트가 있습니다.?

    모든 단일 단계를 포괄하는 복잡한 설명이 아니어야합니다 (범위를 벗어날 것으로 추측합니다). 그러나 중간 IT 담당자가 따를 수있는 설명.

    나는 스스로를 IT 전문가라고 부르는 많은 사람들이이 프로세스를 올바르게 설명 할 수 없다고 확신한다..

    대답

    여러 커뮤니티 회원들이 질문에 대답했지만 올리버 잘츠부르크 (Oliver Salzburg)는 세부적인 답변뿐만 아니라 훌륭한 그래픽.

    JasonC의 이미지, 여기에 배경 화면으로 사용 가능.

    그는 쓴 :

    필자는 프로그래밍 측면과 구성 요소가 서로 이야기하는 방식에 대해 조금 씁니다. 어쩌면 그것은 특정 영역에서 약간의 빛을 발산 할 것입니다..

    프레젠테이션

    화면에 그려진 질문에 게시 한 그 단일 이미지가 있으면 무엇이 필요합니까??

    삼각형을 화면에 그리는 방법은 여러 가지가 있습니다. 간단하게, 정점 버퍼가 사용되지 않았다고 가정 해 봅시다. (에이 정점 버퍼좌표를 저장하는 메모리 영역입니다.) 프로그램이 모든 단일 정점 (정점은 공간의 좌표)에 대해 그래픽 처리 파이프 라인에 간단히 말하면.

    그러나, 우리가 무언가를 그릴 수 있기 전에 먼저 비계를 세워야합니다. 우리가 볼거야. 후에:

    // 화면과 깊이 버퍼 지우기 glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 현재 Modelview 행렬 재설정 glMatrixMode (GL_MODELVIEW); glLoadIdentity (); // 삼각형을 사용하여 그리기 glBegin (GL_TRIANGLES); // 빨간색 glColor3f (1.0f, 0.0f, 0.0f); // 삼각형의 정점 (정면) glVertex3f (0.0f, 1.0f, 0.0f); // 녹색 glColor3f (0.0f, 1.0f, 0.0f); // 왼쪽 삼각형 (앞면) glVertex3f (-1.0f, -1.0f, 1.0f); // 청색 glColor3f (0.0f, 0.0f, 1.0f); // 삼각형의 오른쪽 (정면) glVertex3f (1.0f, -1.0f, 1.0f); // 그리기 완료 glEnd ();

    그래서 그게 어땠어??

    그래픽 카드를 사용하려는 프로그램을 작성할 때 일반적으로 드라이버에 대한 인터페이스를 선택하게됩니다. 드라이버에 대한 몇 가지 잘 알려진 인터페이스는 다음과 같습니다.

    • OpenGL
    • Direct3D
    • 쿠다

    이 예제에서는 OpenGL을 사용합니다. 자, 너 드라이버와의 인터페이스 프로그램을 만드는 데 필요한 모든 도구를 제공합니다. 이야기 그래픽 카드 (또는 드라이버)로 회담 카드에).

    이 인터페이스는 특정 도구들. 이 도구는 프로그램에서 호출 할 수있는 API의 형태를 취합니다..

    이 API는 위의 예에서 사용 된 것으로 볼 수 있습니다. 자세히 살펴 보겠습니다..

    비계

    실제 드로잉을 수행하기 전에 다음을 수행해야합니다. 설정. 당신은 당신의 뷰포트 (실제로 렌더링 될 영역), 당신의 퍼스펙티브 ( 카메라 귀하의 세계로), 안티 앨리어싱을 사용하여 (삼각형 가장자리를 매끄럽게하기 위해) ...

    그러나 우리는 그 어떤 것도 보지 않을 것입니다. 우리는 당신이해야 할 것들을 살짝 들여다 볼 것입니다. 모든 프레임. 처럼:

    화면 지우기

    그래픽 파이프 라인은 매 프레임마다 화면을 지우지 않을 것입니다. 당신은 그것을 말해야 할 것입니다. 왜? 이는 이유:

    화면을 지우지 않으면 간단하게 그려라 모든 프레임. 그래서 우리는 glClear 와 더불어GL_COLOR_BUFFER_BIT 세트. 다른 비트 (GL_DEPTH_BUFFER_BIT)는 OpenGL에게 깊이완충기. 이 버퍼는 어떤 픽셀이 다른 픽셀의 앞 (또는 뒤에)인지를 결정하는 데 사용됩니다..

    변환


    이미지 소스

    변환은 우리가 모든 입력 좌표 (삼각형의 정점)를 취하여 ModelView 행렬을 적용하는 부분입니다. 이것은 설명하다 어떻게 우리의 모델 (정점)은 회전, 크기 조절 및 변환 (이동)됩니다..

    다음으로, Projection 행렬을 적용합니다. 이렇게하면 모든 좌표가 카메라를 올바르게 향하도록 움직입니다..

    이제 뷰포트 매트릭스로 다시 한 번 변형합니다. 우리는 우리의 모델 우리 모니터의 크기로. 이제 렌더링 준비가 된 일련의 정점이 있습니다.!

    우리는 조금 후에 변환으로 돌아올 것입니다..

    그림

    삼각형을 그리기 위해 OpenGL에게 새로운 것을 시작하도록 알릴 수 있습니다. 삼각형 목록 전화 걸기 glBegin 와 더불어 GL_TRIANGLES 일정한.
    그릴 수있는 다른 형태도 있습니다. 삼각형 스트립이나 삼각형 팬처럼. 이는 주로 CPU와 GPU 사이의 통신량을 줄이면 동일한 양의 삼각형을 그리기 때문에 주로 최적화됩니다.

    그 후에 각 삼각형을 구성해야하는 3 개의 정점 집합 목록을 제공 할 수 있습니다. 모든 삼각형은 3 차원 좌표를 사용합니다 (우리가 3D 공간에있는 것처럼). 또한, 나는 또한 색깔 각 정점마다glColor3f 전에 부름 glVertex3f.

    3 개의 꼭지점 (삼각형의 3 모서리) 사이의 음영은 OpenGL에 의해 계산됩니다.자동으로. 다각형의 전체면에 색상을 보간합니다..

    상호 작용

    자, 창을 클릭하면. 응용 프로그램은 클릭 신호를 보내는 창 메시지 만 캡처하면됩니다. 그런 다음 원하는 프로그램에서 모든 작업을 실행할 수 있습니다..

    이것은 제비 3D 장면과 상호 작용하기 시작하면 더 어려워집니다..

    먼저 사용자가 어떤 픽셀을 클릭했는지 명확히 알 필요가 있습니다. 그런 다음, 원근법마우스 클릭 시점부터 장면까지 광선의 방향을 계산할 수 있습니다. 그런 다음 장면의 객체가 있는지 계산할 수 있습니다 교차하다 그 광선에. 이제 사용자가 객체를 클릭했는지 알 수 있습니다..

    그래서, 어떻게 회전시켜야합니까??

    변환

    나는 일반적으로 적용되는 두 가지 유형의 변환을 알고 있습니다.

    • 행렬 기반 변환
    • 뼈 기반 변환

    차이점은 싱글에 영향을 미침 꼭지점. 행렬은 항상 같은 방법으로 모든 그려진 정점에 영향을줍니다. 예제를 보자..

    이전에 우리는 단위 행렬 삼각형을 그리기 전에. 단위 행렬은 단순히 제공하는 것입니다. 변형 없음 조금도. 따라서, 내가 그리는 것은 내 관점에만 영향을받습니다. 따라서 삼각형은 전혀 회전하지 않습니다..

    지금 회전시키고 자한다면, (CPU에서) 직접 수학을하고 간단히 전화를 걸 수 있습니다. glVertex3f다른 회전 된 좌표. 아니면 GPU가 모든 작업을 수행하도록 할 수 있습니다. glRotatef그림 그리기 전에 :

    // Y 축에서 삼각형 회전 glRotatef (amount, 0.0f, 1.0f, 0.0f); 

    물론 고정 된 값입니다. 네가 원한다면 생명 있는, 당신은 계속 추적해야합니다. 매 프레임마다 늘리십시오..

    그래서, 잠깐, 모든 행렬에 이전에 무슨 일이 일어 났습니까??

    이 간단한 예제에서 우리는 행렬에 신경 쓸 필요가 없습니다. 우리는 단순히 전화한다. glRotatef 우리를 위해 모든 것을 처리합니다..

    glRotate 의 회전을 일으킨다. 각도 벡터 주위의 도수 x y z. 현재 행렬 (seeglMatrixMode)에는 다음 행렬을 인수로 사용하여 ifglMultMatrix가 호출 된 것처럼 현재 행렬을 대체하는 행렬이 곱 해집니다.

    수학 식 1에서, x1, x2, x3, x4, x5, x4는 각각 x1, x2, x3, x4, 1 - c - x 0 0 z - 1 - c - y s y z 1 - c + x sz 2 1 - c + c 0 0 0 0 1

    음, 고마워.!

    결론

    분명한 사실은 많은 이야기가 있다는 것입니다. OpenGL. 그러나 그것은 말하지 않고있다. 우리 아무것도. 통신은 어디 있습니까??

    이 예제에서 OpenGL이 말한 유일한 것은 완료되면. 모든 작업에는 일정 시간이 소요됩니다. 어떤 작업은 엄청나게 오래 걸리고, 다른 작업은 믿을 수 없을 정도로 빨라집니다..

    버텍스 보내기 GPU가 그렇게 빨리 될 것입니다, 나는 그것을 표현하는 방법조차 모른다. CPU에서 GPU로 수천 개의 버텍스를 매 프레임마다 전송하는 문제는 전혀 없습니다..

    화면 지우기 뷰포트의 크기에 따라 밀리 초 또는 더 걸릴 수 있습니다 (각 프레임을 그리는 데 약 16 밀리 초 밖에 걸리지 않음). 이를 지우려면, OpenGL은 지우고 자하는 색상의 모든 단일 픽셀을 그려야합니다. 이것은 수백만 픽셀 일 수 있습니다.

    그 외에도 OpenGL에게 그래픽 어댑터의 기능 (최대 해상도, 최대 앤티 앨리어싱, 최대 색상 수 등)에 대해 물을 수 있습니다..

    그러나 특정 색상을 가진 픽셀로 텍스처를 채울 수도 있습니다. 따라서 각 픽셀은 값을 보유하고 텍스처는 데이터로 채워진 거대한 "파일"입니다. 우리는 그래픽 카드에 텍스쳐 버퍼를 만들어로드 할 수 있습니다. 그리고 쉐이더를로드하고, 쉐이더에 우리의 텍스처를 입력으로 사용하고 우리의 "파일".

    그런 다음 새로운 색상의 형태로 계산 결과를 새로운 텍스처로 "렌더링"할 수 있습니다.

    이것이 다른 방법으로 GPU를 작동시키는 방법입니다. 나는 CUDA가 그 측면과 유사하게 수행한다고 생각하지만, 결코 그 일을 할 기회가 없었습니다..

    우리는 전체 주제를 약간 만 만졌을뿐입니다. 3D 그래픽 프로그래밍은 짐승의 지옥입니다..


    이미지 소스


    설명에 추가 할 것이 있습니까? 의견에서 소리가 나지. 다른 기술에 정통한 Stack Exchange 사용자의 답변을 더 읽고 싶습니까? 전체 토론 스레드를 여기에서 확인하십시오..