우선, 나는 그런 긴 질문에 사과하고 싶다. 당신은 그것을 읽을 필요가 없습니다. 질문으로 바로 갈 수도 있고, 필요한 경우 세부 정보를 찾아 볼 수도 있습니다 (가능한 한 많은 정보를 제공하려고 노력했습니다. 내 경험이 너무 많아서 코드가 너무 적어 졌기 때문입니다). 그래서, ...삼각형 권선과 변형에 대해 혼동을 느낀다
저는 삼각형 권선과 변형에 대해 다소 혼란 스럽습니다. 당신이 코멘트에서 볼 수 있듯이, 나는 용어를 사용
float face_colors[nFaces * dim] =
{
1,0,0, //front RED
1,1,1, //back WHITE
0,0,1, //up BLUE
0,1,1, //down SKY BLUE
0,1,0, //right GREEN
1,1,0, //left YELLOW
};
: 나는 다음과 같이 정의 된 큐브 그리기 위해 노력하고 있어요 :
const float a = 0.5f; //half of the cube side length
float positions[nComponents] =
{
//front face
-a, -a, -a,
a, -a, -a,
a, a, -a,
-a, -a, -a,
a, a, -a,
-a, a, -a,
//back face
-a, -a, a,
a, a, a,
a, -a, a,
-a, -a, a,
-a, a, a,
a, a, a,
//up face
-a, a, -a,
a, a, -a,
a, a, a,
-a, a, -a,
a, a, a,
-a, a, a,
//down face
-a, -a, -a,
a, -a, a,
a, -a, -a,
-a, -a, -a,
-a, -a, a,
a, -a, a,
//right face
a, -a, -a,
a, -a, a,
a, a, a,
a, -a, -a,
a, a, a,
a, a, -a,
//left face
-a, -a, -a,
-a, a, a,
-a, -a, a,
-a, -a, -a,
-a, a, -a,
-a, a, a,
};
을 그리고이 내 얼굴의 가정 색상입니다 아래쪽, 왼쪽, 오른쪽 등등.이 단어는 우리가 위치 좌표 (예 : (0, 0, -3a)
, 세계 좌표)에서 큐브를보고 있다고 가정하면 의미를 갖습니다. 알다시피, 내 입방체의 앞면이 시계 반대 방향으로 감겨져 있습니다. (즉, 큐브의 바깥 쪽에서 입방체를보고 삼각형의 정점을 열거하면 반 시계 방향으로 감기가됩니다) .
그래서 필요합니다. 컬링을 사용하도록 설정합니다. 2. 반 시계 방향으로 앞면이라고 말합니다. 3. 뒤쪽면을 컬합니다.
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glFrontFace(GL_CCW);
glCullFace(GL_BACK);
내 투영 매트릭스는 투시 투영 매트릭스이며 modelView 매트릭스는 LookAt 매트릭스입니다. 그들은 정점 쉐이더에 유니폼으로 공급됩니다. 다음
ProjectionMatrix = glm::perspective(45.0f, (float)w/h, 0.1f, 100.0f);
glm::vec3 center(0.0f, 0.0f, 0.0f);
glm::vec3 eye(1.0f, 2.0f, -3.0f);
glm::vec3 up(0.0f, 1.0f, 0.0f);
ModelViewMatrix = glm::lookAt(eye, center, up);
glUniformMatrix4fv(locP, 1, false, glm::value_ptr(ProjectionMatrix));
glUniformMatrix4fv(locMV, 1, false, glm::value_ptr(ModelViewMatrix));
내 정점 셰이더 정의된다
#version 400
layout(location = 0) in vec4 vVertex;
layout(location = 1) in vec4 vColor;
uniform mat4 P;
uniform mat4 MV;
out vec4 vFragColor;
void main(void)
{
vFragColor = vColor;
gl_Position = P * MV * vVertex;
}
내 프래그먼트 쉐이더 사소한 - 그냥 보간 된 색을 출력한다.
이제가 ... 여기에 내가 얻을 출력입니다 : 댄
내가 glFrontFace(GL_CW);
에 glFrontFace(GL_CCW);
을 변경, 또는 대안 적으로, glCullFace(GL_FRONT)
-glCullFace(GL_BACK)
을 변경하는 경우를 나는 기대하세요 (적어도 더 예상 이전은, 렌더링) 두 번째와 세 번째 quesions 참조 : 여기 세 가지 문제를 참조
을, 개 채널 질문에 설명 :
실제 질문 :
Q1 : 왜 내가 의도의 권선 반대입니까? 앞면에 정점을 시계 반대 방향으로 감았습니까?
Q2 왜 내 "왼쪽"얼굴과 "오른쪽"얼굴이 바뀌 었습니까? 왼쪽 얼굴은 노란색이었고 오른쪽 얼굴은 녹색이었고 그 반대도 마찬가지였습니다! 내 변형이 뭐가 잘못 되었 니?
Q3 거기 내내 눈 벡터의 x 좌표가 양수이기 때문에입니다. 즉, 실제로는 왼쪽면이 아닌 오른쪽면을보아야합니다.
나는 그들이 모두 연결되어 있고 아마도 내가 누락 된 매우 기초적인 것으로 생각하기 때문에이 질문들을 함께 질문했다. 이러한 것들을 명확히하기 위해 시간을내어 주셔서 대단히 감사합니다.
나는 여전히 혼란 스럽다. 내가 좋아하는 "세계"좌표계를 자유롭게 정의 할 수는 없습니까? 그리고 LookAt 함수는 벡터를 월드 좌표로받습니다. 그렇다면 기본 Z 축 방향은 어떤 차이가 있습니까? –
Ahhh ... 지금은 이해하기 시작하고 있다고 생각합니다. 세계 좌표계에서도 세 축의 상대적인 배치를 변경할 수는 없습니다. 그게 맞습니까? –
@Armen 그렇습니다. 당신은 모델 뷰 행렬을 (1,1, -1)로 스케일링 할 수 있고 따라서 의도 된 왼손잡이 시스템을 가정하기 위해 z 축을 미러링 할 수 있습니다. 그러나 이것을 제안하지는 않을 것입니다. 오른 손잡이 시스템의 사실상 표준입니다. –