• Advertisement
Sign in to follow this  

Weird issue while rendering screen quad

This topic is 1987 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

Hello,
I'm having some troubles drawing render target's contents on the screen. Problem is probably trivial but I have no luck finding it.
Right now I create small quad (0.2 x 0.2), however for some reason my whole screen becomes white, RTs contents aren't fully white either.
Anyone knows what could possibly cause such issue, or how to fix it?

My render loop can be generalized like this:


if(debug_draw) {
drawRTquad();
}
else {
drawSceneNormally();
}
present();


Here's how I draw the quad (this is in the actual loop, nothing cut from other places):

if(debug_draw) {
VertexShader vertexShader;
vertexShader.Create("vs.cso");
/* vs.cso is compiled shader:
struct Input {
float4 position : POSITION;
float2 texCoord0 : TEXCOORD0;
};
struct Output {
float4 position : SV_POSITION;
float2 texCoord0 : TEXCOORD0;
};
Output main(Input input) {
Output output;
output.position = input.position;
output.texCoord0 = input.texCoord0;
return output;
}
*/
PixelShader pixelShader;
pixelShader.Create("ps.cso");
/* ps.cso is:
SamplerState sampler0 : register(s0);
Texture2D texture0 : register(t0);
struct Input {
float4 position : SV_POSITION;
float2 texCoord0 : TEXCOORD0;
};
float4 main(Input input) : SV_TARGET0 {
return texture0.Sample(sampler0, input.texCoord0);
}
*/
D3D11_INPUT_ELEMENT_DESC inputLayoutDesc[] = {
{"POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0},
{"TEXCOORD", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0}
};
InputLayout inputLayout;
inputLayout.Create(inputLayoutDesc, vertexShader);
/* notice that quad is not fullscreen,
however my whole screen becomes white
*/
float quad[] = {
-0.1, 0.1, 0, 0, 0, 0, 0, 0,
0.1, 0.1, 0, 0, 1, 0, 0, 0,
-0.1, -0.1, 0, 0, 0, 1, 0, 0,
0.1, -0.1, 0, 0, 1, 1, 0, 0
};
VertexBuffer vertexBuffer;
vertexBuffer.Create(quad);
// at first I thought some states cause issue, so I added this
deviceContext->ClearState();
auto windowViewport = Window::instance.GetClientArea();
D3D11_VIEWPORT viewport = {0, 0, get<0>(windowViewport), get<1>(windowViewport), 0, 1};
deviceContext->RSSetViewports(1, &viewport);
deviceContext->OMSetRenderTargets(1, &renderTarget, 0);
deviceContext->VSSetShader(vertexShader.shader, 0, 0);
deviceContext->PSSetShader(pixelShader.shader, 0, 0);
deviceContext->IASetInputLayout(inputLayout.layout);
deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
UINT strides = sizeof(float) * 8;
UINT offsets = 0;
deviceContext->IASetVertexBuffers(0, 1, vertexBuffer.GetPtr(), &strides, &offsets);
/* Visual Studio 2012 Graphical Debugger shows there is something in this SRV
However it fails to debug pixel shader
*/
deviceContext->PSSetShaderResources(0, 1, &RTColor.SRV);
/* draw call gives warning about missing Sampler State,
however it also mentions default state will be used, that's fine
*/
deviceContext->Draw(4, 0);
}
else {
// draw normally
}
swapChain->Present(0, 0);


Let me know if any information needed. Thank you in advance.

Share this post


Link to post
Share on other sites
Advertisement
Found the problem. Appears position.w cannot be 0.

Anyone could explain why?

Share this post


Link to post
Share on other sites
If SV_Position is a float4 the rasterizer assumes that it's a homogeneous coordinate. So it calculates the actual float3 value by dividing by the w component of the float4.

Share this post


Link to post
Share on other sites
Also I believe it will calculate the depth of that pixel at 0, and if you have any sort of depth testing on, all pixels behind it will be rejected.

Share this post


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

  • Advertisement