2016-09-09 8 views
0

C++에서 이미지를 Unity 텍스처로 복사하려고합니다. 이미지는 320x240 픽셀이며 RGBA 형식입니다. 이미지가 괜찮다는 것을 확인했습니다. 나는 단단 D3D11의 전문가는 아니지만, 나는이 기능을 제대로 사용하고 있는지 아니에요UpdateSubresource에서 복사 할 내용을 어떻게 알 수 있습니까?

GraphicDeviceD3D11* gdevice = (GraphicDeviceD3D11*)graphic_device; 
ID3D11DeviceContext* ctx = NULL; 
gdevice->d3d11device->lpVtbl->GetImmediateContext(gdevice->d3d11device, &ctx); 

if (texturePointer) { 
    ctx->lpVtbl->UpdateSubresource(ctx, (ID3D11Resource *)texturePointer, 0, NULL, image, imageWidth * 4, 0); 
} 

ctx->lpVtbl->Release(ctx); 

:

것은 내가 UpdateSubresource을 사용하여 복사하려면, 여기에 코드입니다. UpdateSubresource에 주어진 이미지의 매개 변수는 이미지 버퍼 포인터와 스트라이드 만 있지만 이미지의 높이 또는 버퍼의 길이는 아닙니다.

복사를 중지 할시기를 UpdateResource는 어떻게 알 수 있습니까?

이 코드는 일부 이미지에서는 작동하지만 다른 이미지에서는 작동하지 않습니다. 이미지 버퍼 크기를 약간 넘는 메모리에 액세스 위반이 발생합니다. 따라서 제한 사항을 어딘가에 설정하지는 않습니다.

누군가가 그것에 대해 밝힐 수 있습니까?

+0

'lpVtbl'이란 무엇입니까? 가상 테이블의 일종? 워드 프로세서는 그 포인터에 관해 아무 말도하지 않습니다. – Rakete1111

답변

1

이 기능을 올바르게 사용하고 있습니다. 대상 리소스 (귀하의 경우 texturePointer에 의해 참조 됨)에 모든 필수 데이터가 포함되어 있으며 메서드가 예상대로 작동합니다.

그러나이 간접적 인 것은 무엇입니까 lpVtbl? C++ (c가 아닌)을 사용하는 경우 COM 메소드를 호출하는 간단한 pInstance->Method() 접근 방법을 사용하는 것이 좋습니다.

+0

그것이 내 코드가 아니기 때문에 완전히 확신 할 수는 없습니다. 하지만 lpVtbl을 사용하지 않으면 컴파일되지 않습니다. 나는 이것에 대해 더 깊이 들어가야 할 것이다. 감사! – Nitay

+2

@Nitay'lpVtbl'은 D3D11 헤더에 의해 노출됩니다. ['__cplusplus'] (http://stackoverflow.com/questions/3789340/combining-c-and-c-how-does-ifdef-cplusplus-work)는 정의되지 않았고 (C++로 컴파일되지 않음) 또는'CINTERFACE'가 정의되었습니다 (강제 C 인터페이스). – MooseBoys

+0

@MooseBoys 예, 그게 문제입니다. 저는 C를 사용하고 있습니다. 오랫동안 코드를 꼼짝 않고 바라 보았습니다. 감사! – Nitay