2013-10-30 2 views
2

OpenGL ES 2.0 iOS에서 3D 큐브를 그리려합니다. 큐브와 관련된 다양한 정보 (위치 좌표, 텍스처 맵핑, 법선)를 저장하기 위해 구조체를 만들었습니다. 이제 OpenGL에게이 구조체 내의 법선을 어디에서 찾을 지 알려줄 필요가 있습니다. 모든 컴파일하고 올바르게 렌더링하지만 아래 표와 맨 마지막 줄은 나에게이 경고 제공 :구조체 내에서 법선 전달하기

Incompatible integer to pointer conversion passing 'unsigned long' to parameter of type 'const GLvoid *' (aka 'const void *')

왜 내 코드는 부호없는 긴 반환을? 나는 라인이 요구하고있는 포인터를 얻기 위해 이것을 수정하는 방법을 모른다. 누구든지 내가 뭘 잘못하고 있는지 알 수 있니? 감사. 여기

는 구조체이다

typedef struct { 
    GLKVector3 positionCoordinates; 
    GLKVector2 textureCoordinates; 
    GLKVector3 normalCoordinates; 
} VertexData; 

데이터 좌표

VertexData cameraVertices[] = { 
    //{ position x, position y, position z}, {texture}, {normalX, normalY, normalZ} 
    { { 0.5f, -0.5f, -0.5f}, {0.0f, 0.0f}, { 1.0f, 0.0f, 0.0f} }, // rightward facing (+X) 
    { { 0.5f, 0.5f, -0.5f}, {1.0f, 0.0f}, { 1.0f, 0.0f, 0.0f} }, 
    { { 0.5f, -0.5f, 0.5f}, {0.0f, 1.0f}, { 1.0f, 0.0f, 0.0f} }, 
    { { 0.5f, -0.5f, 0.5f}, {0.0f, 1.0f}, { 1.0f, 0.0f, 0.0f} }, 
    { { 0.5f, 0.5f, -0.5f}, {1.0f, 0.0f}, { 1.0f, 0.0f, 0.0f} }, 
    { { 0.5f, 0.5f, 0.5f}, {1.0f, 1.0f}, { 1.0f, 0.0f, 0.0f} }, 

    { { 0.5f, 0.5f, -0.5f}, {0.0f, 0.0f}, { 0.0f, 1.0f, 0.0f} }, // upward facing (+Y) 
    { {-0.5f, 0.5f, -0.5f}, {1.0f, 0.0f}, { 0.0f, 1.0f, 0.0f} }, 
    { { 0.5f, 0.5f, 0.5f}, {0.0f, 1.0f}, { 0.0f, 1.0f, 0.0f} }, 
    { { 0.5f, 0.5f, 0.5f}, {0.0f, 1.0f}, { 0.0f, 1.0f, 0.0f} }, 
    { {-0.5f, 0.5f, -0.5f}, {1.0f, 0.0f}, { 0.0f, 1.0f, 0.0f} }, 
    { {-0.5f, 0.5f, 0.5f}, {1.0f, 1.0f}, { 0.0f, 1.0f, 0.0f} }, 

    { {-0.5f, 0.5f, -0.5f}, {0.0f, 0.0f}, {-1.0f, 0.0f, 0.0f} }, // leftward facing (-X) 
    { {-0.5f, -0.5f, -0.5f}, {1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f} }, 
    { {-0.5f, 0.5f, 0.5f}, {0.0f, 1.0f}, {-1.0f, 0.0f, 0.0f} }, 
    { {-0.5f, 0.5f, 0.5f}, {0.0f, 1.0f}, {-1.0f, 0.0f, 0.0f} }, 
    { {-0.5f, -0.5f, -0.5f}, {1.0f, 0.0f}, {-1.0f, 0.0f, 0.0f} }, 
    { {-0.5f, -0.5f, 0.5f}, {1.0f, 1.0f}, {-1.0f, 0.0f, 0.0f} }, 

    { {-0.5f, -0.5f, -0.5f}, {0.0f, 0.0f}, { 0.0f, -1.0f, 0.0f} }, // downward facing (-Y) 
    { { 0.5f, -0.5f, -0.5f}, {1.0f, 0.0f}, { 0.0f, -1.0f, 0.0f} }, 
    { {-0.5f, -0.5f, 0.5f}, {0.0f, 1.0f}, { 0.0f, -1.0f, 0.0f} }, 
    { {-0.5f, -0.5f, 0.5f}, {0.0f, 1.0f}, { 0.0f, -1.0f, 0.0f} }, 
    { { 0.5f, -0.5f, -0.5f}, {1.0f, 0.0f}, { 0.0f, -1.0f, 0.0f} }, 
    { { 0.5f, -0.5f, 0.5f}, {1.0f, 1.0f}, { 0.0f, -1.0f, 0.0f} }, 

    { { 0.5f, 0.5f, 0.5f}, {0.0f, 0.0f}, { 0.0f, 0.0f, 1.0f} }, // forward facing (+Z) 
    { {-0.5f, 0.5f, 0.5f}, {1.0f, 0.0f}, { 0.0f, 0.0f, 1.0f} }, 
    { { 0.5f, -0.5f, 0.5f}, {0.0f, 1.0f}, { 0.0f, 0.0f, 1.0f} }, 
    { { 0.5f, -0.5f, 0.5f}, {0.0f, 1.0f}, { 0.0f, 0.0f, 1.0f} }, 
    { {-0.5f, 0.5f, 0.5f}, {1.0f, 0.0f}, { 0.0f, 0.0f, 1.0f} }, 
    { {-0.5f, -0.5f, 0.5f}, {1.0f, 1.0f}, { 0.0f, 0.0f, 1.0f} }, 

    { { 0.5f, -0.5f, -0.5f}, {0.0f, 0.0f}, { 0.0f, 0.0f, -1.0f} }, // rear facing (-Z) 
    { {-0.5f, -0.5f, -0.5f}, {1.0f, 0.0f}, { 0.0f, 0.0f, -1.0f} }, 
    { { 0.5f, 0.5f, -0.5f}, {0.0f, 1.0f}, { 0.0f, 0.0f, -1.0f} }, 
    { { 0.5f, 0.5f, -0.5f}, {0.0f, 1.0f}, { 0.0f, 0.0f, -1.0f} }, 
    { {-0.5f, -0.5f, -0.5f}, {1.0f, 0.0f}, { 0.0f, 0.0f, -1.0f} }, 
    { {-0.5f, 0.5f, -0.5f}, {1.0f, 1.0f}, { 0.0f, 0.0f, -1.0f} }, 
}; 

그리고 (본질적 viewDidLoad에 내) 코드의 해당 라인 :

glEnableVertexAttribArray(GLKVertexAttribPosition); 
glVertexAttribPointer(GLKVertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), offsetof(VertexData, positionCoordinates)); 
glEnableVertexAttribArray(GLKVertexAttribNormal); 
glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), offsetof(VertexData, normalCoordinates)); 

답변

1

좋고, 기본적인을 여기서 문제는 offsetof 매크로가 포인터를 반환하지 않는다는 것입니다. 오프셋을 size_t으로 반환합니다. size_t 크기와 GLvoid * 크기가 다를 수 있으므로 이런 식으로 offsetof (...)의 결과를 사용하지 마십시오.

당신이해야 할 일은 (GLubyte *)0 + offsetof (...)입니다.

+0

감사합니다. 동의 버튼을 클릭하기 전에 또 하나의 질문 :'glVertexAttribPointer'에 대한 첫 번째 호출이 경고를 던지지 않는 이유는 무엇입니까? 저는 동일한 기본 접근법을 사용하고 있습니다. 그래서 왜 다른 행동을하는지 혼란 스럽습니다. 다시 감사합니다! – Alex

+0

@ usr55410 : 실제로 오프셋은 0 일 때 매크로에 대해 다른 것이어야합니다. 제안 된 변경 사항이 문제를 해결 했습니까? –

+0

예, 그들은 그렇게했습니다. 미래의 참조를위한 최종 설명을 찾고 있었을뿐입니다. 고마워요! – Alex

0

사실 나는 더 간단한 방법을 발견했습니다. 내가해야 할 일은 이것을 무효로 만드는 것뿐입니다.

glVertexAttribPointer(GLKVertexAttribNormal, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), (void *)offsetof(VertexData, normalCoordinates)); 
+0

이식성을 위해이 작업을하는 것을 피할 수 있습니다. 'size_t'는 배열의 많은 요소 인'SIZE_MAX'를 처리 할만큼 충분히 커야합니다. 이것은 포인터의 크기와는 독립적으로 정의됩니다. 64 비트 포인터 유형과 32 비트'size_t '만있는 시스템에 있다면 어떻게됩니까? 캐스팅을 통해 방금 만든 포인터의 절반은 유효하지 않은 메모리 위치에서 나옵니다. 그러나 당신이 포인터 연산에서'size_t'를 사용한다면 당신은이 문제를 완전히 피할 수 있습니다 -'size_t'는 포인터보다 크기가 ** 커 ** ** 작지는 않지만 더 작을 수 있습니다. 이 문제는 iPhone 5S에서 발생할 수 있습니다. –

+0

확인. 좋은 지적. – Alex