xna - Invisible geometry in DX11 -
after struggling many hours understand , compensate microsoft's deprecation of d3dx in windows 8, i've run problem can't shake off.
the first time started program, became immortal because of access violation. after having restarted computer , recompiling , running same code, doesn't crash, cube should seeing isn't there.
i'm getting warning "object declared on heap may not aligned 16". afaik research, occurs because of xna math. so, after finding this discussion litteraly tried being suggested. except xmfloat4x4 solution worked, cube still invisible. here's part of code think relevant:
class iegame : public dx11infernalenginebase { public: //... bool loadcontent() { //... vertex vertices[] = { { xmfloat3(-1.0f, 1.0f, -1.0f), xmfloat2(0.0f, 0.0f) }, { xmfloat3(1.0f, 1.0f, -1.0f), xmfloat2(1.0f, 0.0f) }, { xmfloat3(1.0f, 1.0f, 1.0f), xmfloat2(1.0f, 1.0f) }, { xmfloat3(-1.0f, 1.0f, 1.0f), xmfloat2(0.0f, 1.0f) }, { xmfloat3(-1.0f, -1.0f, -1.0f), xmfloat2(0.0f, 0.0f) }, { xmfloat3(1.0f, -1.0f, -1.0f), xmfloat2(1.0f, 0.0f) }, { xmfloat3(1.0f, -1.0f, 1.0f), xmfloat2(1.0f, 1.0f) }, { xmfloat3(-1.0f, -1.0f, 1.0f), xmfloat2(0.0f, 1.0f) }, { xmfloat3(-1.0f, -1.0f, 1.0f), xmfloat2(0.0f, 0.0f) }, { xmfloat3(-1.0f, -1.0f, -1.0f), xmfloat2(1.0f, 0.0f) }, { xmfloat3(-1.0f, 1.0f, -1.0f), xmfloat2(1.0f, 1.0f) }, { xmfloat3(-1.0f, 1.0f, 1.0f), xmfloat2(0.0f, 1.0f) }, { xmfloat3(1.0f, -1.0f, 1.0f), xmfloat2(0.0f, 0.0f) }, { xmfloat3(1.0f, -1.0f, -1.0f), xmfloat2(1.0f, 0.0f) }, { xmfloat3(1.0f, 1.0f, -1.0f), xmfloat2(1.0f, 1.0f) }, { xmfloat3(1.0f, 1.0f, 1.0f), xmfloat2(0.0f, 1.0f) }, { xmfloat3(-1.0f, -1.0f, -1.0f), xmfloat2(0.0f, 0.0f) }, { xmfloat3(1.0f, -1.0f, -1.0f), xmfloat2(1.0f, 0.0f) }, { xmfloat3(1.0f, 1.0f, -1.0f), xmfloat2(1.0f, 1.0f) }, { xmfloat3(-1.0f, 1.0f, -1.0f), xmfloat2(0.0f, 1.0f) }, { xmfloat3(-1.0f, -1.0f, 1.0f), xmfloat2(0.0f, 0.0f) }, { xmfloat3(1.0f, -1.0f, 1.0f), xmfloat2(1.0f, 0.0f) }, { xmfloat3(1.0f, 1.0f, 1.0f), xmfloat2(1.0f, 1.0f) }, { xmfloat3(-1.0f, 1.0f, 1.0f), xmfloat2(0.0f, 1.0f) } }; d3d11_buffer_desc vertexdesc; zeromemory(&vertexdesc, sizeof(vertexdesc)); vertexdesc.usage = d3d11_usage_default; vertexdesc.bindflags = d3d11_bind_vertex_buffer; vertexdesc.bytewidth = sizeof(vertexpos)*24; d3d11_subresource_data resourcedata; zeromemory(&resourcedata, sizeof(resourcedata)); resourcedata.psysmem = vertices; try{ d3dresult = d3ddevice_->createbuffer(&vertexdesc, &resourcedata, &vertexbuffer_); if (failed(d3dresult)) { throw _com_error(d3dresult); } } catch (_com_error & comex){ messagebox(0, comex.errormessage(), "error creating vertex buffer", mb_ok); return false; } word indices[] = { 3, 1, 0, 2, 1, 3, 6, 4, 5, 7, 4, 6, 11, 9, 8, 10, 9, 11, 14, 12, 13, 15, 12, 14, 19, 17, 16, 18, 17, 19, 22, 20, 21, 23, 20, 22 }; d3d11_buffer_desc indexdesc; zeromemory(&indexdesc, sizeof(indexdesc)); indexdesc.usage = d3d11_usage_default; indexdesc.bindflags = d3d11_bind_index_buffer; indexdesc.bytewidth = sizeof(word)* 36; indexdesc.cpuaccessflags = 0; resourcedata.psysmem = indices; try{ d3dresult = d3ddevice_->createbuffer(&indexdesc, &resourcedata, &indexbuffer_); if (failed(d3dresult)) { throw _com_error(d3dresult); } } catch (_com_error & comex){ messagebox(0, comex.errormessage(), "error creating index buffer", mb_ok); return false; } try{ std::vector<byte> texturefile = loadfile("c:\\users\\marcus\\documents\\visual studio 2013\\projects\\infernalengine\\debug\\guide.png"); d3dresult = createwictexturefrommemory(d3ddevice_, d3dcontext_, texturefile.data(), texturefile.size(), nullptr, &colormapview_, 0); if (failed(d3dresult)) { throw _com_error(d3dresult); } } catch (_com_error & comex){ messagebox(0, comex.errormessage(), "error loading texture", mb_ok); return false; } d3d11_sampler_desc colormapdesc; zeromemory(&colormapdesc, sizeof(colormapdesc)); colormapdesc.addressu = d3d11_texture_address_wrap; colormapdesc.addressv = d3d11_texture_address_wrap; colormapdesc.addressw = d3d11_texture_address_wrap; colormapdesc.comparisonfunc = d3d11_comparison_never; colormapdesc.filter = d3d11_filter_min_mag_mip_linear; colormapdesc.maxlod = d3d11_float32_max; try{ d3dresult = d3ddevice_->createsamplerstate(&colormapdesc, &colormapsampler_); if (failed(d3dresult)) { throw _com_error(d3dresult); } } catch (_com_error & comex){ messagebox(0, comex.errormessage(), "error creating sampler state", mb_ok); return false; } d3d11_buffer_desc constdesc; zeromemory(&constdesc, sizeof(constdesc)); constdesc.bindflags = d3d11_bind_constant_buffer; constdesc.bytewidth = sizeof(xmmatrix); constdesc.usage = d3d11_usage_default; try{ d3dresult = d3ddevice_->createbuffer(&constdesc, nullptr, &viewcb_); if (failed(d3dresult)) { throw _com_error(d3dresult); } } catch (_com_error & comex){ messagebox(0, comex.errormessage(), "error creating view matrix", mb_ok); return false; } try{ d3dresult = d3ddevice_->createbuffer(&constdesc, nullptr, &projcb_); if (failed(d3dresult)) { throw _com_error(d3dresult); } } catch (_com_error & comex){ messagebox(0, comex.errormessage(), "error creating projection matrix", mb_ok); return false; } try{ d3dresult = d3ddevice_->createbuffer(&constdesc, nullptr, &worldcb_); if (failed(d3dresult)) { throw _com_error(d3dresult); } } catch (_com_error & comex){ messagebox(0, comex.errormessage(), "error creating world matrix", mb_ok); return false; } viewmatrix_ = xmmatrixidentity(); projmatrix_ = xmmatrixperspectivefovlh(xm_pidiv4, 800.0f / 600.0f, 0.01f, 100.0f); viewmatrix_ = xmmatrixtranspose(viewmatrix_); projmatrix_ = xmmatrixtranspose(projmatrix_); return true; } void unloadcontent() { if (colormapsampler_) colormapsampler_->release(); if (colormapview_) colormapview_->release(); if (solidcolorvs_) solidcolorvs_->release(); if (solidcolorps_) solidcolorps_->release(); if (inputlayout_) inputlayout_->release(); if (vertexbuffer_) vertexbuffer_->release(); if (viewcb_) viewcb_->release(); if (projcb_) projcb_->release(); if (worldcb_) worldcb_->release(); colormapsampler_ = 0; colormapview_ = 0; solidcolorvs_ = 0; solidcolorps_ = 0; inputlayout_ = 0; vertexbuffer_ = 0; viewcb_ = 0; projcb_ = 0; worldcb_ = 0; } void render() { if (d3dcontext_ == 0) return; float clearcolor[4] = { 0.0f, 0.0f, 0.25f, 1.0f }; d3dcontext_->clearrendertargetview(backbuffertarget_, clearcolor); d3dcontext_->cleardepthstencilview(depthstencilview_, d3d11_clear_depth, 1.0f, 0); unsigned int nstride = sizeof(vertexpos); unsigned int noffset = 0; d3dcontext_->iasetinputlayout(inputlayout_); d3dcontext_->iasetvertexbuffers(0, 1, &vertexbuffer_, &nstride, &noffset); d3dcontext_->iasetindexbuffer(indexbuffer_, dxgi_format_r16_uint, 0); d3dcontext_->iasetprimitivetopology(d3d11_primitive_topology_trianglelist); d3dcontext_->vssetshader(solidcolorvs_, 0, 0); d3dcontext_->pssetshader(solidcolorps_, 0, 0); d3dcontext_->pssetshaderresources(0, 1, &colormapview_); d3dcontext_->pssetsamplers(0, 1, &colormapsampler_); xmmatrix rotationmatrix; rotationmatrix = xmmatrixrotationrollpitchyaw(0.0f, 0.7f, 0.7f); xmmatrix translationmatrix; translationmatrix = xmmatrixtranslation(0.0f, 0.0f, 0.6f); xmmatrix worldmatrix; worldmatrix = rotationmatrix * translationmatrix; worldmatrix = xmmatrixtranspose(worldmatrix); d3dcontext_->updatesubresource(worldcb_, 0, nullptr, &worldmatrix, 0, 0); d3dcontext_->updatesubresource(viewcb_, 0, nullptr, &viewmatrix_, 0, 0); d3dcontext_->updatesubresource(projcb_, 0, nullptr, &projmatrix_, 0, 0); d3dcontext_->vssetconstantbuffers(0, 1, &worldcb_); d3dcontext_->vssetconstantbuffers(1, 1, &viewcb_); d3dcontext_->vssetconstantbuffers(2, 1, &projcb_); d3dcontext_->drawindexed(36, 0, 0); swapchain_->present(0, 0); } private: id3d11vertexshader * solidcolorvs_; id3d11pixelshader * solidcolorps_; id3d11inputlayout * inputlayout_; id3d11buffer * vertexbuffer_; id3d11buffer * indexbuffer_; id3d11shaderresourceview * colormapview_; id3d11samplerstate * colormapsampler_; id3d11buffer * viewcb_; id3d11buffer * projcb_; id3d11buffer * worldcb_; xmmatrix viewmatrix_; xmmatrix projmatrix_; };
update : so, after enabling d3d debug device, in output. can't make sense of it.
d3d11 warning: process terminating. using simple reporting. please call reportliveobjects() @ runtime standard reporting. [ state_creation warning #0: unknown] d3d11 warning: live producer @ 0x00f7f3f4, refcount: 3. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x00f80218, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x0403a110, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x0403801c, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x04040304, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x0404054c, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x0404089c, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x04040aac, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x04040ce0, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x04041394, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x040428e4, refcount: 1. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x04043534, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x04043894, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x0404490c, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x0404f5cc, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x0405c7ec, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x0405b65c, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x04069d0c, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x0406701c, refcount: 1. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x040653ac, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x0408243c, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x04036ffc, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x0403719c, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x04085c04, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x0408656c, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object @ 0x040618cc, refcount: 0. [ state_creation warning #0: unknown] d3d11 warning: live object : 25 [ state_creation warning #0: unknown] dxgi warning: live producer @ 0x00f4ae50, refcount: 4. [ state_creation warning #0: ] dxgi warning: live object @ 0x00f4d480, refcount: 2. [ state_creation warning #0: ] dxgi warning: live object : 1 [ state_creation warning #0: ]
update : xmmatrixs aligned. cube still invisible though. can't find visual studio graphics debugger. know it should according research, isn't there.
the key issue here using xmmatrix
requires 16-byte alignment class member heap allocated, new
on x86 (32-bit) provides 8-byte alignment default.
this xmfloat4x4
, xmloadfloat4x4
, , xmstorefloat4x4
exist resolve.
xmmatrix vm = xmmatrixidentity(); xmmatrix pm = xmmatrixperspectivefovlh(xm_pidiv4, 800.0f / 600.0f, 0.01f, 100.0f); xmstorefloat4x4( &viewmatrix_, xmmatrixtranspose(vm) ); xmstoreflaot4x4( &projmatrix_, xmmatrixtranspose(pm) ); xmfloat4x4 viewmatrix_; xmfloat4x4 projmatrix_;
that or can switch coding in x64 (64-bit) native has 16-byte alignment default , can use xmmatrix
or xmvector
class member without worry alignment in cases.
this addressed on msdn in directxmath programming guide. see getting started, type usage guidelines
you should take @ simplemath wrapper in directx tool kit. types handle load/store behavior c++ "magic":
#include <simplemath.h> xmmatrix vm = xmmatrixidentity(); xmmatrix pm = xmmatrixperspectivefovlh(xm_pidiv4, 800.0f / 600.0f, 0.01f, 100.0f); viewmatrix_ = xmmatrixtranspose(vm); projmatrix_ = xmmatrixtranspose(pm); directx::simplemath::matrix viewmatrix_; directx::simplemath::matrix projmatrix_;
if haven't seen these yet, sure read:
- where directx sdk?
- living without d3dx
- directx sdk tools catalog
- directx sdk samples catalog
- directx sdks of age
- direct3d win32 game visual studio template
edit windows desktop directx development, should use visual studio 2013 community edition if aren't using vs 2013 professional+. includes vs graphics debugger vs 2013 express windows desktop not.
Comments
Post a Comment