Jump to content
  • Advertisement
Sign in to follow this  
Migi0027

DX11 DX11 Sprite Like Technique - With a quad

This topic is 1939 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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

Share this post


Link to post
Share on other sites
Advertisement

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.

Share this post


Link to post
Share on other sites

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...

Share this post


Link to post
Share on other sites

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...

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Edited by Migi0027

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!