0

In my code, i am making 2 rectangles,

Rectangle1: Rendering On a Texture.

Rectangle2: Rendering On Back Buffer.

I am trying to do programmable blending,so need to access the destination pixel in pixel shader.

In my code,

I am creating a texture like below:

d3d11Device->CreateTexture2D(&textureDesc, NULL, &renderTargetTextureMap);

After this i am creating Render Target view of the texture.

  d3d11Device->CreateRenderTargetView(renderTargetTextureMap, &renderTargetViewDesc, &renderTargetViewMap);

After this i am declaring vertex and pixel shader.

Then in my draw call,

i am performing following thing:

float bgColor[4] = {0.0f, 0.0f,0.0f, 1.0f };
d3d11DevCon->ClearRenderTargetView(renderTargetViewMap, bgColor);

float bgColor2[4] = { 0.0f, 1.0f, 0.0f, 1.0f };

////////////////////////////////////////////////Buffer 1///////////////////////////////////////////////////////////////
//Set the vertex buffer
UINT stride = sizeof(Vertex);
UINT offset = 0;

///////////////////////////////////////////////////////////Buffer 2//////////////////////////////////////////////////////////////////

d3d11DevCon->IASetIndexBuffer(d2dIndexBuffer, DXGI_FORMAT_R32_UINT, 0);
d3d11DevCon->IASetVertexBuffers(0, 1, &triangleVertBuffer, &stride, &offset);
////Draw the triangle
d3d11DevCon->DrawIndexed(6, 0, 0);

I assume that since i have set my render target view as renderTargetViewMap, so my draw call will render to texture only.

Now i am rendering to my backbuffer:

////////////////////////////////////////////

d3d11DevCon->OMSetRenderTargets(1, &renderTargetView, NULL);
d3d11DevCon->PSSetShaderResources(0, 1, &shaderResourceViewMap);
//d3d11DevCon->ClearRenderTargetView(renderTargetView, bgColor2);

d3d11DevCon->IASetIndexBuffer(d2dIndexBuffer2, DXGI_FORMAT_R32_UINT, 0);
d3d11DevCon->IASetVertexBuffers(0, 1, &triangleVertBuffer2, &stride, &offset);

////Draw the triangle
d3d11DevCon->DrawIndexed(6, 0, 0);

//Present the backbuffer to the screen
SwapChain->Present(0, 0);

So, in this way my rendering is happening.

Issue Face:

In my pixel shader,

VS_OUTPUT VS(float4 inPos : POSITION, float4 inColor : COLOR)
{
    VS_OUTPUT output;

    output.Pos = inPos;
    output.Color = inColor;

    return output;
}

float4 PS(VS_OUTPUT input) : SV_TARGET
{
    float2 temp;
    temp = input.Pos;
    float4 diffuse = ObjTexture.Sample(ObjSamplerState,0.5+0.5*temp);

    return input.Color + diffuse;
}

Here the diffuse is comming out to be equal to my bgcolor which i have set when rendering to texture

float bgColor[4] = {0.0f, 0.0f,0.0f, 1.0f };
d3d11DevCon->ClearRenderTargetView(renderTargetViewMap, bgColor);

I have also drawn a rectangle on it, but those pixels i am not able to access.

How can i access the pixel of rectangle that i have drawn on rendering to texture.

This is Issue Image Issue Image

Desired Result

Desired Result

Shader File: Effect.fx

struct VS_OUTPUT
{
    float4 Pos : SV_POSITION;
    float4 Color : COLOR;
};

Texture2D ObjTexture;
SamplerState ObjSamplerState;


VS_OUTPUT VS(float4 inPos : POSITION, float4 inColor : COLOR)
{
    VS_OUTPUT output;

    output.Pos = inPos;
    output.Color = inColor;

    return output;
}

float4 PS(VS_OUTPUT input) : SV_TARGET
{
    float2 temp;
    temp = input.Pos;
    float4 diffuse = ObjTexture.Sample(ObjSamplerState,0.5+0.5*temp);

    return input.Color + diffuse;
}

Edit - 1:

With my latest change in code, i am able to blend my rectangle 2 with rectangle 1, but one issue i am facing is that when i blend then major part of my rectangle 2 is changes to yellow (red + green) on edges only i am able to see the actual green color.

Modified Issue Case

Modified code:

main.cpp

//Include and link appropriate libraries and headers//
#pragma comment(lib, "d3d11.lib")
#pragma comment(lib, "d3dx11.lib")
#pragma comment(lib, "d3dx10.lib")

#include <windows.h>
#include <d3d11.h>
#include <d3dx11.h>
#include <d3dx10.h>
#include <xnamath.h>




//Global Declarations - Interfaces//
IDXGISwapChain* SwapChain;
ID3D11Device* d3d11Device;
ID3D11DeviceContext* d3d11DevCon;
ID3D11RenderTargetView* renderTargetView;

ID3D11Buffer* triangleVertBuffer;
ID3D11Buffer* triangleVertBuffer2;
ID3D11VertexShader* VS;
ID3D11PixelShader* PS;
ID3D10Blob* VS_Buffer;
ID3D10Blob* PS_Buffer;
ID3D11InputLayout* vertLayout;


XMMATRIX mapView;
XMMATRIX mapProjection;

XMVECTOR DefaultForward = XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f);


//Global Declarations - Others//
LPCTSTR WndClassName = L"firstwindow";
HWND hwnd = NULL;
HRESULT hr;

const int Width = 800;
const int Height = 600;

bool InitializeDirect3d11App(HINSTANCE hInstance)
{
    //Describe our Buffer
    DXGI_MODE_DESC bufferDesc;

    ZeroMemory(&bufferDesc, sizeof(DXGI_MODE_DESC));

    bufferDesc.Width = Width;
    bufferDesc.Height = Height;
    bufferDesc.RefreshRate.Numerator = 60;
    bufferDesc.RefreshRate.Denominator = 1;
    bufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    bufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
    bufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;

    //Describe our SwapChain
    DXGI_SWAP_CHAIN_DESC swapChainDesc;

    ZeroMemory(&swapChainDesc, sizeof(DXGI_SWAP_CHAIN_DESC));

    swapChainDesc.BufferDesc = bufferDesc;
    swapChainDesc.SampleDesc.Count = 1;
    swapChainDesc.SampleDesc.Quality = 0;
    swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    swapChainDesc.BufferCount = 1;
    swapChainDesc.OutputWindow = hwnd;
    swapChainDesc.Windowed = TRUE;
    swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;


    //Create our SwapChain
    hr = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, NULL, NULL, NULL,
        D3D11_SDK_VERSION, &swapChainDesc, &SwapChain, &d3d11Device, NULL, &d3d11DevCon);

    //Create our BackBuffer
    ID3D11Texture2D* BackBuffer;
    hr = SwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&BackBuffer);

    //Create our Render Target
    hr = d3d11Device->CreateRenderTargetView(BackBuffer, NULL, &renderTargetView);
    BackBuffer->Release();
    ////////////////////////////////////////////////////////////////////////EXPERIMENT AREA//////////////////////////////////////////////////////////////////////////////////////
    ZeroMemory(&textureDesc, sizeof(textureDesc));

    // Setup the texture description.
    // We will have our map be a square
    // We will need to have this texture bound as a render target AND a shader resource
    textureDesc.Width = Width/ 3.9729999999999999999999999999999;
    textureDesc.Height = Height/3.9729999999999999999999999999999;
    textureDesc.MipLevels = 1;
    textureDesc.ArraySize = 1;
    textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    textureDesc.SampleDesc.Count = 1;
    textureDesc.SampleDesc.Quality = 0;
    textureDesc.Usage = D3D11_USAGE_DEFAULT;
    textureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
    textureDesc.CPUAccessFlags = 0;
    textureDesc.MiscFlags = 0;

    d3d11Device->CreateTexture2D(&textureDesc, NULL, &renderTargetTextureMap);

    // Setup the description of the render target view.
    renderTargetViewDesc.Format = textureDesc.Format;
    renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
    renderTargetViewDesc.Texture2D.MipSlice = 0;

    // Create the render target view.
    d3d11Device->CreateRenderTargetView(renderTargetTextureMap, &renderTargetViewDesc, &renderTargetViewMap);



    /////////////////////// Map's Shader Resource View
    // Setup the description of the shader resource view.
    shaderResourceViewDesc.Format = textureDesc.Format;
    shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
    shaderResourceViewDesc.Texture2D.MostDetailedMip = 0;
    shaderResourceViewDesc.Texture2D.MipLevels = 1;

    // Create the shader resource view.
    d3d11Device->CreateShaderResourceView(renderTargetTextureMap, &shaderResourceViewDesc, &shaderResourceViewMap);


    d3d11DevCon->OMSetRenderTargets(1, &renderTargetViewMap, NULL);
    d3d11DevCon->PSSetShaderResources(0, 1, &shaderResourceViewMap);

    return true;
}

void CleanUp()
{
    //Release the COM Objects we created
    SwapChain->Release();
    d3d11Device->Release();
    d3d11DevCon->Release();
    renderTargetView->Release();
    triangleVertBuffer->Release();
    VS->Release();
    PS->Release();
    VS_Buffer->Release();
    PS_Buffer->Release();
    vertLayout->Release();
}

bool InitScene()
{
    //Compile Shaders from shader file
    hr = D3DX11CompileFromFile(L"Effect.fx", 0, 0, "VS", "vs_5_0", 0, 0, 0, &VS_Buffer, 0, 0);
    hr = D3DX11CompileFromFile(L"Effect.fx", 0, 0, "PS", "ps_5_0", 0, 0, 0, &PS_Buffer, 0, 0);

    //Create the Shader Objects
    hr = d3d11Device->CreateVertexShader(VS_Buffer->GetBufferPointer(), VS_Buffer->GetBufferSize(), NULL, &VS);
    hr = d3d11Device->CreatePixelShader(PS_Buffer->GetBufferPointer(), PS_Buffer->GetBufferSize(), NULL, &PS);

    //Set Vertex and Pixel Shaders
    d3d11DevCon->VSSetShader(VS, 0, 0);
    d3d11DevCon->PSSetShader(PS, 0, 0);


    //Create the Input Layout
    hr = d3d11Device->CreateInputLayout(layout, numElements, VS_Buffer->GetBufferPointer(),
        VS_Buffer->GetBufferSize(), &vertLayout);

    //Set the Input Layout
    d3d11DevCon->IASetInputLayout(vertLayout);

    //Set Primitive Topology
    d3d11DevCon->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

    //Create the Viewport
    D3D11_VIEWPORT viewport;
    ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));

    viewport.TopLeftX = 0;
    viewport.TopLeftY = 0;
    viewport.Width = 800;
    viewport.Height = 600;

    //Set the Viewport
    d3d11DevCon->RSSetViewports(1, &viewport);



    ////////////////***********************First  Texture Vertex Buffer *******************************/////////////////////////////
    //Create the vertex buffer

    Vertex v[] =
    {
        Vertex(-0.5f, -0.5f, 0.0f, 1.0f,0.0f,0.0f, 1.0f),
        Vertex(-0.5f,  0.5f, 0.0f, 1.0f,0.0f,0.0f, 1.0f),
        Vertex(0.5f,  0.5f, 0.0f,   1.0f, 0.0f,0.0f, 1.0f),
        Vertex(0.5f, -0.5f, 0.0f,   1.0f,0.0f, 0.0f, 1.0f),
    };

    DWORD indices[] = {
        // Front Face
        0,  1,  3,
        1,  2,  3,
    };


    D3D11_BUFFER_DESC indexBufferDesc;
    ZeroMemory(&indexBufferDesc, sizeof(indexBufferDesc));

    indexBufferDesc.Usage = D3D11_USAGE_DEFAULT;
    indexBufferDesc.ByteWidth = sizeof(DWORD) * 2 * 3;
    indexBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
    indexBufferDesc.CPUAccessFlags = 0;
    indexBufferDesc.MiscFlags = 0;

    D3D11_SUBRESOURCE_DATA iinitData;

    iinitData.pSysMem = indices;
    d3d11Device->CreateBuffer(&indexBufferDesc, &iinitData, &d2dIndexBuffer);


    D3D11_BUFFER_DESC vertexBufferDesc;
    ZeroMemory(&vertexBufferDesc, sizeof(vertexBufferDesc));

    vertexBufferDesc.Usage = D3D11_USAGE_DEFAULT;
    vertexBufferDesc.ByteWidth = sizeof(Vertex) * 4;
    vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    vertexBufferDesc.CPUAccessFlags = 0;
    vertexBufferDesc.MiscFlags = 0;

    D3D11_SUBRESOURCE_DATA vertexBufferData;

    ZeroMemory(&vertexBufferData, sizeof(vertexBufferData));
    vertexBufferData.pSysMem = v;
    hr = d3d11Device->CreateBuffer(&vertexBufferDesc, &vertexBufferData, &triangleVertBuffer);




    ////////////////////////////////////////////////////// Second Vertex.


     Vertex v2[] = {
        // positions          // colors           // texture coords
        Vertex(1.0f, 1.0f, 0.0f,0.0f,1.0f,0.0f,1.0f),   // top right
        Vertex(1.0f,0.0f, 0.0f,0.0f,1.0f,0.0f,1.0f),   // bottom right
        Vertex(0.0f,0.0f, 0.0f,0.0f,1.0f,0.0f,1.0f),   // bottom left
        Vertex(0.0f, 1.0, 0.0f,0.0f, 1.0f,0.0f,1.0f)    // top left 
    };

     DWORD indices2[] = {
         // Front Face
         0,  1,  2,
        0,  2,  3,
     };



     D3D11_BUFFER_DESC indexBufferDesc2;
     ZeroMemory(&indexBufferDesc2, sizeof(indexBufferDesc2));

     indexBufferDesc2.Usage = D3D11_USAGE_DEFAULT;
     indexBufferDesc2.ByteWidth = sizeof(DWORD) * 2 * 3;
     indexBufferDesc2.BindFlags = D3D11_BIND_INDEX_BUFFER;
     indexBufferDesc2.CPUAccessFlags = 0;
     indexBufferDesc2.MiscFlags = 0;

     D3D11_SUBRESOURCE_DATA iinitData2;

     iinitData2.pSysMem = indices2;
     d3d11Device->CreateBuffer(&indexBufferDesc2, &iinitData2, &d2dIndexBuffer2);


    D3D11_BUFFER_DESC vertexBufferDesc2;
    ZeroMemory(&vertexBufferDesc2, sizeof(vertexBufferDesc2));

    vertexBufferDesc2.Usage = D3D11_USAGE_DEFAULT;
    vertexBufferDesc2.ByteWidth = sizeof(Vertex) * 4;
    vertexBufferDesc2.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    vertexBufferDesc2.CPUAccessFlags = 0;
    vertexBufferDesc2.MiscFlags = 0;

    D3D11_SUBRESOURCE_DATA vertexBufferData2;

    ZeroMemory(&vertexBufferData2, sizeof(vertexBufferData2));
    vertexBufferData2.pSysMem = v2;
    hr = d3d11Device->CreateBuffer(&vertexBufferDesc2, &vertexBufferData2, &triangleVertBuffer2);






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



    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    return true;
}

Shader File:

struct VS_OUTPUT
{
    float4 Pos : SV_POSITION;
    float4 Color : COLOR;
};

Texture2D ObjTexture;
SamplerState ObjSamplerState;


VS_OUTPUT VS(float4 inPos : POSITION, float4 inColor : COLOR)
{
    VS_OUTPUT output;

    output.Pos = inPos;
    output.Color = inColor;

    return output;
}

float4 PS(VS_OUTPUT input) : SV_TARGET
{
    float2 temp;
    temp = input.Pos;
    float4 diffuse = ObjTexture.Sample(ObjSamplerState,0.5*temp);

    return input.Color + diffuse ;
}

        return DefWindowProc(hwnd,
            msg,
            wParam,
            lParam);
    }

Edit 3:

My vertex Structure:

struct Vertex    //Overloaded Vertex Structure
{
    Vertex() {}
    Vertex(float x, float y, float z,
        float cr, float cg, float cb, float ca)
        : pos(x, y, z), color(cr, cg, cb, ca) {}

    XMFLOAT3 pos;
    XMFLOAT4 color;
};

Input description:

D3D11_INPUT_ELEMENT_DESC layout[] =
{
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};

I think so issue is when i pass my texture and read it in diffuse in pixel shader, then mapping of my texture on back buffer is not same and hence i am only finding red color from 2nd scan line and hence resultant zero is produced..?

Edit 3:

My initialization code:

struct Vertex    //Overloaded Vertex Structure
{
    Vertex() {}
    Vertex(float x, float y, float z,
        float cr, float cg, float cb, float ca)
        : pos(x, y, z), color(cr, cg, cb, ca) {}

    XMFLOAT3 pos;
    XMFLOAT4 color;
};

ID3D11Texture2D* renderTargetTextureMap;
ID3D11RenderTargetView* renderTargetViewMap;
ID3D11ShaderResourceView* shaderResourceViewMap;
ID3D11SamplerState* CubesTexSamplerState;


ID3D11Buffer *d2dIndexBuffer;
ID3D11Buffer *d2dIndexBuffer2;

D3D11_TEXTURE2D_DESC textureDesc;
D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDesc;
D3D11_SHADER_RESOURCE_VIEW_DESC shaderResourceViewDesc;




D3D11_INPUT_ELEMENT_DESC layout[] =
{
    { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 },
};
UINT numElements = ARRAYSIZE(layout);

bool InitializeDirect3d11App(HINSTANCE hInstance)
{
    //Describe our Buffer
    DXGI_MODE_DESC bufferDesc;

    ZeroMemory(&bufferDesc, sizeof(DXGI_MODE_DESC));

    bufferDesc.Width = Width;
    bufferDesc.Height = Height;
    bufferDesc.RefreshRate.Numerator = 60;
    bufferDesc.RefreshRate.Denominator = 1;
    bufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    bufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
    bufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;

    //Describe our SwapChain
    DXGI_SWAP_CHAIN_DESC swapChainDesc;

    ZeroMemory(&swapChainDesc, sizeof(DXGI_SWAP_CHAIN_DESC));

    swapChainDesc.BufferDesc = bufferDesc;
    swapChainDesc.SampleDesc.Count = 1;
    swapChainDesc.SampleDesc.Quality = 0;
    swapChainDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
    swapChainDesc.BufferCount = 1;
    swapChainDesc.OutputWindow = hwnd;
    swapChainDesc.Windowed = TRUE;
    swapChainDesc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;


    //Create our SwapChain
    hr = D3D11CreateDeviceAndSwapChain(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, NULL, NULL, NULL,
        D3D11_SDK_VERSION, &swapChainDesc, &SwapChain, &d3d11Device, NULL, &d3d11DevCon);

    //Create our BackBuffer
    ID3D11Texture2D* BackBuffer;
    hr = SwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), (void**)&BackBuffer);

    //Create our Render Target
    hr = d3d11Device->CreateRenderTargetView(BackBuffer, NULL, &renderTargetView);
    BackBuffer->Release();
    ////////////////////////////////////////////////////////////////////////EXPERIMENT AREA//////////////////////////////////////////////////////////////////////////////////////
    ZeroMemory(&textureDesc, sizeof(textureDesc));

    // Setup the texture description.
    // We will have our map be a square
    // We will need to have this texture bound as a render target AND a shader resource
    textureDesc.Width = Width/2;
    textureDesc.Height = Height/2;
    textureDesc.MipLevels = 1;
    textureDesc.ArraySize = 1;
    textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
    textureDesc.SampleDesc.Count = 1;
    textureDesc.SampleDesc.Quality = 0;
    textureDesc.Usage = D3D11_USAGE_DEFAULT;
    textureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
    textureDesc.CPUAccessFlags = 0;
    textureDesc.MiscFlags = 0;

    d3d11Device->CreateTexture2D(&textureDesc, NULL, &renderTargetTextureMap);

    // Setup the description of the render target view.
    renderTargetViewDesc.Format = textureDesc.Format;
    renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
    renderTargetViewDesc.Texture2D.MipSlice = 0;

    // Create the render target view.
    d3d11Device->CreateRenderTargetView(renderTargetTextureMap, &renderTargetViewDesc, &renderTargetView);



    /////////////////////// Map's Shader Resource View
    // Setup the description of the shader resource view.
    shaderResourceViewDesc.Format = textureDesc.Format;
    shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
    shaderResourceViewDesc.Texture2D.MostDetailedMip = 0;
    shaderResourceViewDesc.Texture2D.MipLevels = 1;

    // Create the shader resource view.
    d3d11Device->CreateShaderResourceView(renderTargetTextureMap, &shaderResourceViewDesc, &shaderResourceViewMap);


    //d3d11DevCon->OMSetRenderTargets(1, &renderTargetViewMap, NULL);
    //d3d11DevCon->PSSetShaderResources(0, 1, &shaderResourceViewMap);

    return true;
}

void CleanUp()
{
    //Release the COM Objects we created
    SwapChain->Release();
    d3d11Device->Release();
    d3d11DevCon->Release();
    renderTargetView->Release();
    triangleVertBuffer->Release();
    VS->Release();
    PS->Release();
    VS_Buffer->Release();
    PS_Buffer->Release();
    vertLayout->Release();
}

bool InitScene()
{
    //Compile Shaders from shader file
    hr = D3DX11CompileFromFile(L"Effect.fx", 0, 0, "VS", "vs_5_0", 0, 0, 0, &VS_Buffer, 0, 0);
    hr = D3DX11CompileFromFile(L"Effect.fx", 0, 0, "PS", "ps_5_0", 0, 0, 0, &PS_Buffer, 0, 0);

    //Create the Shader Objects
    hr = d3d11Device->CreateVertexShader(VS_Buffer->GetBufferPointer(), VS_Buffer->GetBufferSize(), NULL, &VS);
    hr = d3d11Device->CreatePixelShader(PS_Buffer->GetBufferPointer(), PS_Buffer->GetBufferSize(), NULL, &PS);

    //Set Vertex and Pixel Shaders
    d3d11DevCon->VSSetShader(VS, 0, 0);
    d3d11DevCon->PSSetShader(PS, 0, 0);


    //Create the Input Layout
    hr = d3d11Device->CreateInputLayout(layout, numElements, VS_Buffer->GetBufferPointer(),
        VS_Buffer->GetBufferSize(), &vertLayout);

    //Set the Input Layout
    d3d11DevCon->IASetInputLayout(vertLayout);

    //Set Primitive Topology
    d3d11DevCon->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

    //Create the Viewport
    D3D11_VIEWPORT viewport;
    ZeroMemory(&viewport, sizeof(D3D11_VIEWPORT));

    viewport.TopLeftX = 0;
    viewport.TopLeftY = 0;
    viewport.Width = 800;
    viewport.Height = 600;

    //Set the Viewport
    d3d11DevCon->RSSetViewports(1, &viewport);



    ////////////////***********************First  Texture Vertex Buffer *******************************/////////////////////////////
    //Create the vertex buffer

    Vertex v[] =
    {
        Vertex(-0.35f, -0.35f, 0.0f, 1.0f,0.0f,0.0f, 1.0f),
        Vertex(-0.35f,  0.35f, 0.0f, 1.0f,0.0f,0.0f, 1.0f),
        Vertex(0.35f,  0.35f, 0.0f, 1.0f, 0.0f,0.0f, 1.0f),
        Vertex(0.35f, -0.35f, 0.0f, 1.0f,0.0f, 0.0f, 1.0f),
    };

    DWORD indices[] = {
        // Front Face
        0,  1,  3,
        1,  2,  3,
    };


    D3D11_BUFFER_DESC indexBufferDesc;
    ZeroMemory(&indexBufferDesc, sizeof(indexBufferDesc));

    indexBufferDesc.Usage = D3D11_USAGE_DEFAULT;
    indexBufferDesc.ByteWidth = sizeof(DWORD) * 2 * 3;
    indexBufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
    indexBufferDesc.CPUAccessFlags = 0;
    indexBufferDesc.MiscFlags = 0;

    D3D11_SUBRESOURCE_DATA iinitData;

    iinitData.pSysMem = indices;
    d3d11Device->CreateBuffer(&indexBufferDesc, &iinitData, &d2dIndexBuffer);


    D3D11_BUFFER_DESC vertexBufferDesc;
    ZeroMemory(&vertexBufferDesc, sizeof(vertexBufferDesc));

    vertexBufferDesc.Usage = D3D11_USAGE_DEFAULT;
    vertexBufferDesc.ByteWidth = sizeof(Vertex) * 4;
    vertexBufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    vertexBufferDesc.CPUAccessFlags = 0;
    vertexBufferDesc.MiscFlags = 0;

    D3D11_SUBRESOURCE_DATA vertexBufferData;

    ZeroMemory(&vertexBufferData, sizeof(vertexBufferData));
    vertexBufferData.pSysMem = v;
    hr = d3d11Device->CreateBuffer(&vertexBufferDesc, &vertexBufferData, &triangleVertBuffer);




    ////////////////////////////////////////////////////// Second Vertex.


     Vertex v2[] = {
        // positions          // colors           // texture coords
        Vertex(1.0f, 1.0f, 0.0f,0.0f,1.0f,0.0f,1.0f),   // top right
        Vertex(1.0f,0.0f, 0.0f,0.0f,1.0f,0.0f,1.0f),   // bottom right
        Vertex(0.0f,0.0f, 0.0f,0.0f,1.0f,0.0f,1.0f),   // bottom left
        Vertex(0.0f, 1.0, 0.0f,0.0f, 1.0f,0.0f,1.0f)    // top left 
    };

     DWORD indices2[] = {
         // Front Face
         0,  1,  2,
        0,  2,  3,
     };



     D3D11_BUFFER_DESC indexBufferDesc2;
     ZeroMemory(&indexBufferDesc2, sizeof(indexBufferDesc2));

     indexBufferDesc2.Usage = D3D11_USAGE_DEFAULT;
     indexBufferDesc2.ByteWidth = sizeof(DWORD) * 2 * 3;
     indexBufferDesc2.BindFlags = D3D11_BIND_INDEX_BUFFER;
     indexBufferDesc2.CPUAccessFlags = 0;
     indexBufferDesc2.MiscFlags = 0;

     D3D11_SUBRESOURCE_DATA iinitData2;

     iinitData2.pSysMem = indices2;
     d3d11Device->CreateBuffer(&indexBufferDesc2, &iinitData2, &d2dIndexBuffer2);


    D3D11_BUFFER_DESC vertexBufferDesc2;
    ZeroMemory(&vertexBufferDesc2, sizeof(vertexBufferDesc2));

    vertexBufferDesc2.Usage = D3D11_USAGE_DEFAULT;
    vertexBufferDesc2.ByteWidth = sizeof(Vertex) * 4;
    vertexBufferDesc2.BindFlags = D3D11_BIND_VERTEX_BUFFER;
    vertexBufferDesc2.CPUAccessFlags = 0;
    vertexBufferDesc2.MiscFlags = 0;

    D3D11_SUBRESOURCE_DATA vertexBufferData2;

    ZeroMemory(&vertexBufferData2, sizeof(vertexBufferData2));
    vertexBufferData2.pSysMem = v2;
    hr = d3d11Device->CreateBuffer(&vertexBufferDesc2, &vertexBufferData2, &triangleVertBuffer2);

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    return true;
}

Edit 4:

Added draw scene code:

void DrawScene()
{

    //Set the vertex buffer
    UINT stride = sizeof(Vertex);
    UINT offset = 0;

    ///////////////////////////////////////////////////////////Buffer 2//////////////////////////////////////////////////////////////////

    d3d11DevCon->IASetIndexBuffer(d2dIndexBuffer, DXGI_FORMAT_R32_UINT, 0);
    d3d11DevCon->IASetVertexBuffers(0, 1, &triangleVertBuffer, &stride, &offset);
    ////Draw the triangle
    d3d11DevCon->DrawIndexed(6, 0, 0);

    d3d11DevCon->OMSetRenderTargets(1, &renderTargetView, NULL);
    ////////////////////////////////////////////
    d3d11DevCon->PSSetShaderResources(0, 1, &shaderResourceViewMap);



    d3d11DevCon->IASetIndexBuffer(d2dIndexBuffer2, DXGI_FORMAT_R32_UINT, 0);
    d3d11DevCon->IASetVertexBuffers(0, 1, &triangleVertBuffer2, &stride, &offset);

    ////Draw the triangle
    d3d11DevCon->DrawIndexed(6, 0, 0);

    //Present the backbuffer to the screen
    SwapChain->Present(0, 0);
}
29
  • 1
    You shouldn't use texture coords in the vertices because you don't specify it in the layout. Also you don't have to sample a texture in the shader. You might also need two different shaders for the second rectangle. Just use input.color.a *0.5. Commented Oct 9, 2017 at 6:58
  • 1
    Have you set any textures? Because I don't see it in the code. Commented Oct 9, 2017 at 7:23
  • 1
    Ok then in the shader that processes your shader view try setting the color directly for testing it. Like return half4(1,0,0,0.5f); Commented Oct 9, 2017 at 8:06
  • 1
    As I said, you don't have texture coords defined in your vertex. That's why nothing happens when you sample the texture in your PS. You need different vertices for the first render to texture pass and for the second pass. Paste the full initialization code so I can try to modify it here. Commented Oct 9, 2017 at 10:33
  • 2
    he is trying to use the x,y coordinates of its second draw as texture coordinates Commented Oct 9, 2017 at 11:53

1 Answer 1

1

In order to calculate correct texture coordinates from the vertex Position, you need to: 1.Create the render target texture with Width and Height (not the halves):

textureDesc.Width = Width; // /2; // Do not use half width
textureDesc.Height = Height; // /2;  // Do not use half height

2.Divide the position to a float2(1 / Width, 1 / Height) in your pixel shader, like this:

float2 tex = input.Pos * float2(1.0f / 800.0f, 1.0f / 600.0f);
float4 diffuse = ObjTexture.Sample(ObjSamplerState, tex);
return input.Color + diffuse;
Sign up to request clarification or add additional context in comments.

2 Comments

what is the reason behind: input.Pos * float2(1.0f / 800.0f, 1.0f / 600.0f);
To translate the position from 800x600 in the 0-1 range.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.