Weird issue while rendering screen quad

Started by
2 comments, last by Seabolt 11 years, 9 months ago
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.
Advertisement
Found the problem. Appears position.w cannot be 0.

Anyone could explain why?
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.
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.
Perception is when one imagination clashes with another

This topic is closed to new replies.

Advertisement