Jump to content

  • Log In with Google      Sign In   
  • Create Account

We're offering banner ads on our site from just $5!

1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.


DX11 Sprite Like Technique - With a quad


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
9 replies to this topic

#1 Migi0027 =A=   Crossbones+   -  Reputation: 1971

Like
0Likes
Like

Posted 22 March 2013 - 03:27 PM

Hi guys,

 

right now I'm having a small quad with a texture on it, and I wan't it to face my camera. The reason for that is because I wan't to mess around with Post Processing, It looks for me right now:

 

if ssao

  Render Normals to TEXTUREN

  Render Position to TEXTUREP

Render Diffuse     to TEXTURED

 

Render Plane with TEXTUREN | TEXTUREP | TEXTURED - To do some post processing

Show it!

 

Now please correct me if this is a wrong way!

 

But how is it possible to rotate and translate a quad to face the player/camera, looking like it's a real 3d scene (with some post processing) ?

 

Thank You


Hi! Cuboid Zone
The Rule: Be polite, be professional, but have a plan to steal all their shaders!


Sponsor:

#2 Migi0027 =A=   Crossbones+   -  Reputation: 1971

Like
0Likes
Like

Posted 23 March 2013 - 05:06 AM

Though now I'm not sure if it's the right way...


Hi! Cuboid Zone
The Rule: Be polite, be professional, but have a plan to steal all their shaders!


#3 Jason Z   Crossbones+   -  Reputation: 5163

Like
0Likes
Like

Posted 23 March 2013 - 06:23 AM

But how is it possible to rotate and translate a quad to face the player/camera, looking like it's a real 3d scene (with some post processing) ?

There are a number of ways to do a full screen quad.  Typically you just send four vertices with already transformed content (i.e. w=1 already) and their positions are in the clip space corners.  They would be something like this:

 

(-1,1,0,1) for upper left

(1,1,0,1) for upper right

(-1,-1,0,1) for lower left

(1,-1,0,1) for lower right

 

Since these are in clip space, you are guaranteed to cover the entire viewport regardless of the actual size of it.



#4 Migi0027 =A=   Crossbones+   -  Reputation: 1971

Like
0Likes
Like

Posted 23 March 2013 - 05:18 PM

But how in terms of HLSL would this be possible?

 

So would i specify those 4 points and directly map them into HLSL, without any use of any Matrices? Sorry, I'm not very familiar with this topic of view space conversions...


Hi! Cuboid Zone
The Rule: Be polite, be professional, but have a plan to steal all their shaders!


#5 Jason Z   Crossbones+   -  Reputation: 5163

Like
0Likes
Like

Posted 23 March 2013 - 06:03 PM

But how in terms of HLSL would this be possible?

 

So would i specify those 4 points and directly map them into HLSL, without any use of any Matrices? Sorry, I'm not very familiar with this topic of view space conversions...

Yup - that's exactly right.  The vertices are already ready to go to the rasterizer, so you just pass them through the vertex shader.  Just make sure your w-values are equal to 1, and it should work fairly easily.  To test it out, you can also try modifying the values to cover half the screen, a quarter of the screen, etc...



#6 Migi0027 =A=   Crossbones+   -  Reputation: 1971

Like
0Likes
Like

Posted 24 March 2013 - 10:07 AM

Sorry to take your time, I do understand the concept, but I'm doing it wrong somehow.

 

Post Process Shader file for now: (Where shader stuff and quad is created)

 

#include "stdafx.h"
#include "PostProcess.h"

#include <d3dcompiler.h>
#include <DxErr.h>

#define CE_WARNING(title, message) MessageBoxA(NULL, message, title, 0) 

BOOL PostProcessClass::Create( ID3D11Device *&dev, ID3D11DeviceContext *&devcon )
{
	string finals = string(
		"C:\\Users\\Utilizador\\Documents\\Visual Studio 2012\\Projects\\Cube3D\\Product\\Bin32\\") + string("PostProcessShader.hlsl").c_str();

	ID3D10Blob *vserrors;
	ID3D10Blob *pserrors;
	HRESULT HR;

	D3DX11CompileFromFile(finals.c_str(), 0, 0, "VShader", "vs_5_0", D3DCOMPILE_DEBUG, 0, 0, &VS, &vserrors, &HR);
	D3DX11CompileFromFile(finals.c_str(), 0, 0, "PShader", "ps_5_0", D3DCOMPILE_DEBUG, 0, 0, &PS, &pserrors, &HR);
	
	// create the shader objects
	if (!VS)
	{
		DXTRACE_ERR(TEXT(DXGetErrorDescription(HR)),HR);

		MessageBoxA(NULL, "The Post Process vertex shader creation has failed, program will now exit!", "ERROR", 0);
		exit(0);
	}
	if (!PS)
	{
		DXTRACE_ERR(TEXT(DXGetErrorDescription(HR)),HR);

		MessageBoxA(NULL, "The Post Process pixel shader creation has failed, program will now exit!", "ERROR", 0);
		exit(0);
	}
	
	dev->CreateVertexShader(VS->GetBufferPointer(), VS->GetBufferSize(), NULL, &pVS);
	dev->CreatePixelShader(PS->GetBufferPointer(), PS->GetBufferSize(), NULL, &pPS);

	D3D11_INPUT_ELEMENT_DESC ied[] =
	{
		{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0}
	};
	
	if (dev->CreateInputLayout(ied, 1, VS->GetBufferPointer(), VS->GetBufferSize(), &pLayout) != S_OK)
		CE_WARNING("Input Layout Creation", "Input Layout creation in Post Process has failed!");

	// create the vertex buffer
	D3D11_BUFFER_DESC bd;
	ZeroMemory(&bd, sizeof(bd));

	Vertices[0] = D3DXVECTOR3(-1, 0, 1);
	Vertices[1] = D3DXVECTOR3(1, 0, 1);
	Vertices[2] = D3DXVECTOR3(-1, 0, -1);
	Vertices[3] = D3DXVECTOR3(1, 0, 1);

	Indices[0] = 3;
	Indices[1] = 1;
	Indices[2] = 2;
	Indices[3] = 2;
	Indices[4] = 1;
	Indices[5] = 0;

	bd.Usage = D3D11_USAGE_DYNAMIC;
	bd.ByteWidth = sizeof(D3DXVECTOR3) * 4;
	bd.BindFlags = D3D11_BIND_VERTEX_BUFFER;
	bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
	
	dev->CreateBuffer(&bd, NULL, &vBFF);

	D3D11_MAPPED_SUBRESOURCE ms;
	// copy the vertices into the buffer
	devcon->Map(vBFF, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms);    // map the buffer
	memcpy(ms.pData, Vertices, sizeof(Vertices));                 // copy the data
	devcon->Unmap(vBFF, NULL);

	//**INDICES**//

	bd.Usage = D3D11_USAGE_DYNAMIC;
	bd.ByteWidth = sizeof(DWORD) * 6;
	bd.BindFlags = D3D11_BIND_INDEX_BUFFER;
	bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
	
	dev->CreateBuffer(&bd, NULL, &iBFF);

	D3D11_MAPPED_SUBRESOURCE msI;
	// copy the vertices into the buffer
	devcon->Map(iBFF, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &msI);    // map the buffer
	memcpy(msI.pData, Indices, sizeof(Indices));                 // copy the data
	devcon->Unmap(iBFF, NULL);
}

void PostProcessClass::ApplyShader(ID3D11Device *&dev, ID3D11DeviceContext *&devcon)
{
	// set the shader objects
	devcon->VSSetShader(pVS, 0, 0);
	devcon->PSSetShader(pPS, 0, 0);
	devcon->IASetInputLayout(pLayout);
}

void PostProcessClass::Render(ID3D11DeviceContext *&devcon, ID3D11Device *&dev)
{
	ApplyShader(dev, devcon);

	UINT stride = sizeof(D3DXVECTOR3);
	UINT offset = 0;

	devcon->IASetVertexBuffers(0, 1, &vBFF, &stride, &offset);
	devcon->IASetIndexBuffer(iBFF, DXGI_FORMAT_R32_UINT, 0);

	devcon->DrawIndexed(6, 0, 0);
}

 

Now the output is a black screen, and heres the reason from debugging:

 

9sw294.png

 

When you look at the vertex shader, the result is a straight line, which isn't exactly what I wanted happy.png

 

Now the question is why?

 

Ohh, almost forgot, my shader (it's simple for now for debugging):

 

struct VOut
{
    float4 position : SV_POSITION;
};

VOut VShader(float3 position : POSITION)
{
    VOut output;

    output.position = float4(position, 1.0f);
	output.position.w = 1.0f;
	
    return output;
}

float4 PShader(VOut input) : SV_TARGET
{
	return float4(1, 0, 0, 1);
}

Edited by Migi0027, 24 March 2013 - 02:26 PM.

Hi! Cuboid Zone
The Rule: Be polite, be professional, but have a plan to steal all their shaders!


#7 Migi0027 =A=   Crossbones+   -  Reputation: 1971

Like
0Likes
Like

Posted 24 March 2013 - 03:31 PM

Between, should I even send an index buffer? For something as simple as this, is Direct3D capable of generating it itself?


Hi! Cuboid Zone
The Rule: Be polite, be professional, but have a plan to steal all their shaders!


#8 Adam_42   Crossbones+   -  Reputation: 2572

Like
0Likes
Like

Posted 24 March 2013 - 03:51 PM

You can generate the geometry in the vertex shader: http://www.altdevblogaday.com/2011/08/08/interesting-vertex-shader-trick/

 

Note that what gets generated there isn't a quad, that's because using a single triangle makes things slightly more efficient in the pixel shader.


Edited by Adam_42, 24 March 2013 - 03:51 PM.


#9 Migi0027 =A=   Crossbones+   -  Reputation: 1971

Like
0Likes
Like

Posted 24 March 2013 - 04:25 PM

Wait, so what should I do, I'm probably not understanding this then... What's wrong with my code?


Edited by Migi0027, 25 March 2013 - 05:28 AM.

Hi! Cuboid Zone
The Rule: Be polite, be professional, but have a plan to steal all their shaders!


#10 Migi0027 =A=   Crossbones+   -  Reputation: 1971

Like
0Likes
Like

Posted 25 March 2013 - 06:24 AM

Ok, got it working using Adam_42's method, but thanks!


Hi! Cuboid Zone
The Rule: Be polite, be professional, but have a plan to steal all their shaders!





Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS