Jump to content

  • Log In with Google      Sign In   
  • Create Account


Member Since 12 Mar 2011
Offline Last Active Aug 25 2014 08:45 PM

Topics I've Started

Pixel Perfect Sprites

21 January 2014 - 12:15 AM

In a texture I have a square sprite (though it does not take up the whole texture, just a small portion).


I set up my UV coordinates to target just the sprite.


Sampler code:

    oSamplerDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT;
    oSamplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP;
    oSamplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP;
    oSamplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP;
    oSamplerDesc.MipLODBias = 0.0f;
    oSamplerDesc.MaxAnisotropy = 1;
    oSamplerDesc.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
    oSamplerDesc.BorderColor[0] = 0;
    oSamplerDesc.BorderColor[1] = 0;
    oSamplerDesc.BorderColor[2] = 0;
    oSamplerDesc.BorderColor[3] = 0;
    oSamplerDesc.MinLOD = 0;
    oSamplerDesc.MaxLOD = D3D11_FLOAT32_MAX;

When rendering the sprite to the screen using an orthographic projection with no rotating it renders perfectly.


However, if I scale the sprite non-uniformly (as it is being use as a frame that stretches) then the parts of the texture surrounding the sprite seem to be sampled.


I drew a coloured border around my square sprite and can see the red bleeding in to the edges of the texture in the above scenario.


A more detailed explanation...

Here are some frame pieces for a frame, a bar and a corner. The bar is to be stretched to accommodate the frame dimensions whereas the corner is not.


Here is the frame rendering in-game. Notice the coloured borders are ignored, they were not included using the UV coordinates I set.



Now here is the exact same example as the above except I've changed the overall scale for the frame to reduce its size. (I've re-shaped the frame as that is part of its functionality)



I get the positions for my texture sampling like this...

The squares represent pixels, the blue squares are pixels in a sprite, the red circles are the positions I use.



Why is there sampling around the sprite when the frame is scaled smaller?

Alpha blending fails unless Debug mode

13 March 2013 - 11:30 PM



Compiling with visual studio 2010...


If Compiling in DEBUG mode with D3D11_CREATE_DEVICE_DEBUG set for device creation, alpha blending works fine.

If Compiling in DEBUG mode with D3D11_CREATE_DEVICE_DEBUG NOT set for device creation, alpha blending works fine.

If Compiling in RELEASE mode with D3D11_CREATE_DEVICE_DEBUG set for device creation, alpha blending works fine.

If Compiling in RELEASE mode with D3D11_CREATE_DEVICE_DEBUG NOT set for device creation, alpha blending does not work... looks like alpha testing.

D3D11_BLEND_DESC oBlendStateDesc;

oBlendStateDesc.AlphaToCoverageEnable = 0;
oBlendStateDesc.IndependentBlendEnable = 0;

for (unsigned int a = 0; a < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; ++a)
	oBlendStateDesc.RenderTarget[a].BlendEnable = 1;
	oBlendStateDesc.RenderTarget[a].SrcBlend = D3D11_BLEND_SRC_ALPHA;
	oBlendStateDesc.RenderTarget[a].DestBlend = D3D11_BLEND_INV_SRC_ALPHA;
	oBlendStateDesc.RenderTarget[a].BlendOp = D3D11_BLEND_OP_ADD;
	oBlendStateDesc.RenderTarget[a].SrcBlendAlpha = D3D11_BLEND_ONE;
	oBlendStateDesc.RenderTarget[a].DestBlendAlpha = D3D11_BLEND_ONE;
	oBlendStateDesc.RenderTarget[a].BlendOpAlpha = D3D11_BLEND_OP_ADD;
	oBlendStateDesc.RenderTarget[a].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;

HRESULT HResult = m_poDevice->CreateBlendState(&oBlendStateDesc, &m_poBlendState); //HResult returns S_OK

Anyone have any idea what may be causing this?


UPDATE: Tested on two different PC's... Both windows 7 64 bit, one has a GTX 460 & the other is a GTX 580. The one with the GTX 580 does not have any problems with alpha blending.


SOLVED: There was an initialized variable in there somewhere and I can only assume creating in debug mode caught the error. Another difference between the two tested machines is the visual studio version. So perhaps the later version machine (gtx 580) caught the error also.

Guidance Creating/Finding Framework/Engine

05 March 2013 - 06:19 PM

I'm interested in using a low-level c++ framework (engine?) for creating games in 2D while not costing much and containing the following cross-platform (across PC) functionality:

  • Graphics
  • Input
  • Networking
  • Physics
  • Sound

I haven't had much luck finding anything that matches this criteria... Torque2D seeming the closest. I couldn't find much documenation/tutorials about working with the engine on a core level (seems mostly scripting examples).

In my spare time I created a DirectX11 framework that suits most of my needs listed above (c++, 2D, graphics, Input, Physics(Box2D)). Since I couldn't find much else I'm thinking its best to continue developing the framework, making it cross-platform (across PC). At present I'm trying to do this with the graphics & input.

So I'm looking into openGL 3.3... I'm thinking it will match all of the functionality I'm using in dx11 (Currently using feature level for dx10) allowing games I created to be run on Windows XP/vista, Mac & Linux as well instead of just windows 7+.

Currently I'm focusing on making these components cross-platform:

  • Input (Keyboard and mouse)
  • Window (Will need to work with both dx11 and opengl 3.3)
  • Timing

...Followed by implementing opengl 3.3.

Research I've done so far:

  • Going cross platform in this way across PC means I can target roughly another 20% of people using PCs (according to steam surveys)
  • freeGlut - Stay away from, don't even have control over render loop
  • SDL - Input, Window (usable with dx11 & opengl 3.3?), Timing

I'm unsure if SDL is usable with opengl 3.3, especially since I'd be using an "unstable" version.

I'd like to control initialization of opengl directly if possible/reasonable and sending the handle of the window (if that is how it is done on other OS's besides Windows)

I'm thinking a good source of information would be the fifth edition of the OpenGL SuperBible.

Given all this... can anyone give advice of mention any other resources.

[Resolved] std::list clear() - Unhandled Exception

26 January 2013 - 08:31 PM

What are some common causes for unhandled exceptions from a std::list's Clear() call? Given...


*The list does not contain pointers, the resource is never released manually e.g std::list<int>


*It breaks here (inside list)

	void _Orphan_ptr(_Myt& _Cont, _Nodeptr _Ptr) const
		{	// orphan iterators with specified node pointers
		_Lockit _Lock(_LOCK_DEBUG);
		const_iterator **_Pnext = (const_iterator **)_Cont._Getpfirst();
		if (_Pnext != 0)
			while (*_Pnext != 0)
				if ((*_Pnext)->_Ptr == this->_Myhead
					|| _Ptr != 0 && (*_Pnext)->_Ptr != _Ptr) //!!BREAKS HERE - On second pass through loop (while (*_Pnext != 0)) )
					_Pnext = (const_iterator **)(*_Pnext)->_Getpnext();
					{	// orphan the iterator
					*_Pnext = *(const_iterator **)(*_Pnext)->_Getpnext();
 #endif /* _ITERATOR_DEBUG_LEVEL == 2 */

Rendering to a texture (not for post-processing fx)

22 January 2013 - 05:58 PM

Trying to set up a class which renders text to a texture (specifically in 2D). I have text rendering atm but obviously if the string never changes I could save on performance a lot by rendering the static text into a single texture.


I got it working to some degree, though I have another post about that issue which I think is unrelated to this post...



I'm posting this to ask if these are the normal steps you would take to acheive this:

  1. Disable depth & stencil testing (2D)
  2. Enable alpha blending
  3. Set up projection to accomodate text block dimensions
  4. Set up render target texture2D to accomodate text block dimensions
  5. Set up viewport to accomodate text block dimensions
  6. EDIT: Clear render target (forgot to mention that, ty L.Spiro for reminding me)
  7. Render text into texture
  8. Set back to default projection, view port and render target

One thing I forgot when following these steps was that textures dimensions are supposed to a power of 2. Though it appeared to render undistorted (text block dimensions were not a power of 2 or even close).