• Advertisement
Sign in to follow this  

DX11 DirectX11 Texture Issue, not applying correctly?

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

Hey there,

I've recently started texturing 3d objects in DirectX11 using C++, although I've come across a very strange issue no one seems to no one whats wrong with it. I was hoping I could find some experienced programmers who could shine some light on this issue.

I'm trying to apply a simple texture to a cube

How it should look:

How it looks:

As you can see it's kinda fuzzy? I'm not sure how to explain it, but I have no idea why it's happening...

#include "Object.h"
void Object::Render(ID3D11DeviceContext * pImmediateContext)
//Load Constant Buffer Struct
CBUFFER cBuffer;
//Setup HLSL lighting
cBuffer.LightVector = D3DXVECTOR4(1.0f, 1.0f, 1.0f, 0.0f);
cBuffer.LightColor = D3DXCOLOR(0.5f, 0.5f, 0.5f, 1.0f);
cBuffer.AmbientColor = D3DXCOLOR(0.2f, 0.2f, 0.2f, 1.0f);
//simple animation
static float Time = 0.0f;
Time += 0.0001f;
D3DXMatrixRotationY(&matRotate, Time);
//Create the view matrix
&D3DXVECTOR3(0.0f, 3.0f, 5.0f), //Camera position
&D3DXVECTOR3(0.0f, 0.0f, 0.0f), //the look-at position
&D3DXVECTOR3(0.0f, 1.0f, 0.0f) //the up direction
//Create the projection matrix
(FLOAT)D3DXToRadian(45), //Field of View
(FLOAT)1280 / (FLOAT)720, //aspect ratio
1.0f, //near view-plane
100.0f); //far view-plane
cBuffer.Final = matRotate * matView * matProjection;
cBuffer.Rotation = matRotate;
//Setup the Sampler State
static int i = 0; i++; if(i > 30000) i = 0;
if(i > 10000)
pImmediateContext->PSSetSamplers(0, 1, &g_pSamplerState[0]);
else if (i > 10000 && i < 20000)
pImmediateContext->PSSetSamplers(0, 1, &g_pSamplerState[1]);
pImmediateContext->PSSetSamplers(0, 1, &g_pSamplerState[2]);
// select which vertex buffer to display
UINT stride = sizeof(VERTEX);
UINT offset = 0;
pImmediateContext->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset);
pImmediateContext->IASetIndexBuffer(g_pIBuffer, DXGI_FORMAT_R32_UINT, 0);
// select which primtive type we are using
//Load in Shaders
pImmediateContext->VSSetShader( g_pVertexShader, 0, 0 );
pImmediateContext->PSSetShader( g_pPixelShader, 0, 0 );

/* CUBE 1 */
//Create the rotation matrix, spin on the Y axis at 0.001f per frame
//D3DXMatrixRotationY(&matRotate, Time);
//Move the shape
//D3DXMatrixTranslation(&matTranslate, 5.0f, 2.0f, 0.0f);
//Create the final transform
//cBuffer.Final = matRotate * matTranslate * matView * matProjection;
//cBuffer.Rotation = matRotate;
pImmediateContext->UpdateSubresource(g_pCBuffer, 0, 0, &cBuffer, 0, 0);
pImmediateContext->PSSetShaderResources(0, 1, &woodTexture); //add texture
pImmediateContext->DrawIndexed(36, 0, 0);
/* CUBE 2 */
//Create the rotation matrix, spin on the Y axis at 0.001f per frame
//D3DXMatrixRotationX(&matRotate, Time);
//Move the shape
D3DXMatrixTranslation(&matTranslate, -5.0f, 2.0f, 0.0f);
//Create the final transform
cBuffer.Final = matRotate * matTranslate * matView * matProjection;
cBuffer.Rotation = matRotate;
pImmediateContext->UpdateSubresource(g_pCBuffer, 0, 0, &cBuffer, 0, 0);
pImmediateContext->PSSetShaderResources(0, 1, &brickTexture); //add texture
pImmediateContext->DrawIndexed(36, 0, 0);
void Object::InitGraphics(ID3D11Device * device, ID3D11DeviceContext * pImmediateContext)
VERTEX OurVertices[] =
{-1.0f, -1.0f, 1.0f, D3DXVECTOR3(0.0f, 0.0f, 1.0f), 0.0f, 0.0f}, // side 1
{1.0f, -1.0f, 1.0f, D3DXVECTOR3(0.0f, 0.0f, 1.0f), 0.0f, 1.0f},
{-1.0f, 1.0f, 1.0f, D3DXVECTOR3(0.0f, 0.0f, 1.0f), 1.0f, 0.0f},
{1.0f, 1.0f, 1.0f, D3DXVECTOR3(0.0f, 0.0f, 1.0f), 1.0f, 1.0f},
{-1.0f, -1.0f, -1.0f, D3DXVECTOR3(0.0f, 0.0f, -1.0f), 0.0f, 0.0f}, // side 2
{-1.0f, 1.0f, -1.0f, D3DXVECTOR3(0.0f, 0.0f, -1.0f), 0.0f, 1.0f},
{1.0f, -1.0f, -1.0f, D3DXVECTOR3(0.0f, 0.0f, -1.0f), 1.0f, 0.0f},
{1.0f, 1.0f, -1.0f, D3DXVECTOR3(0.0f, 0.0f, -1.0f), 1.0f, 1.0f},
{-1.0f, 1.0f, -1.0f, D3DXVECTOR3(0.0f, 1.0f, 0.0f), 0.0f, 0.0f}, // side 3
{-1.0f, 1.0f, 1.0f, D3DXVECTOR3(0.0f, 1.0f, 0.0f), 0.0f, 1.0f},
{1.0f, 1.0f, -1.0f, D3DXVECTOR3(0.0f, 1.0f, 0.0f), 1.0f, 0.0f},
{1.0f, 1.0f, 1.0f, D3DXVECTOR3(0.0f, 1.0f, 0.0f), 1.0f, 1.0f},
{-1.0f, -1.0f, -1.0f, D3DXVECTOR3(0.0f, -1.0f, 0.0f), 0.0f, 0.0f}, // side 4
{1.0f, -1.0f, -1.0f, D3DXVECTOR3(0.0f, -1.0f, 0.0f), 0.0f, 1.0f},
{-1.0f, -1.0f, 1.0f, D3DXVECTOR3(0.0f, -1.0f, 0.0f), 1.0f, 0.0f},
{1.0f, -1.0f, 1.0f, D3DXVECTOR3(0.0f, -1.0f, 0.0f), 1.0f, 1.0f},
{1.0f, -1.0f, -1.0f, D3DXVECTOR3(1.0f, 0.0f, 0.0f), 0.0f, 0.0f}, // side 5
{1.0f, 1.0f, -1.0f, D3DXVECTOR3(1.0f, 0.0f, 0.0f), 0.0f, 1.0f},
{1.0f, -1.0f, 1.0f, D3DXVECTOR3(1.0f, 0.0f, 0.0f), 1.0f, 0.0f},
{1.0f, 1.0f, 1.0f, D3DXVECTOR3(1.0f, 0.0f, 0.0f), 1.0f, 1.0f},
{-1.0f, -1.0f, -1.0f, D3DXVECTOR3(-1.0f, 0.0f, 0.0f), 0.0f, 0.0f}, // side 6
{-1.0f, -1.0f, 1.0f, D3DXVECTOR3(-1.0f, 0.0f, 0.0f), 0.0f, 1.0f},
{-1.0f, 1.0f, -1.0f, D3DXVECTOR3(-1.0f, 0.0f, 0.0f), 1.0f, 0.0f},
{-1.0f, 1.0f, 1.0f, D3DXVECTOR3(-1.0f, 0.0f, 0.0f), 1.0f, 1.0f},
// create the vertex buffer
ZeroMemory(&bd, sizeof(bd));
bd.Usage = D3D11_USAGE_DYNAMIC; // write access access by CPU and GPU
bd.ByteWidth = sizeof(VERTEX) * 24; // size is the VERTEX struct
bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; // use as a vertex buffer
bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; // allow CPU to write in buffer
device->CreateBuffer(&bd, NULL, &g_pVertexBuffer); // create the buffer
// copy the vertices into the buffer
pImmediateContext->Map(g_pVertexBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms); // map the buffer
memcpy(ms.pData, OurVertices, sizeof(OurVertices)); // copy the data
pImmediateContext->Unmap(g_pVertexBuffer, NULL); // unmap the buffer
//Create the index buffer out of DWORD
DWORD OurIndices[] =
0, 1, 2, // side 1
2, 1, 3,
4, 5, 6, // side 2
6, 5, 7,
8, 9, 10, // side 3
10, 9, 11,
12, 13, 14, // side 4
14, 13, 15,
16, 17, 18, // side 5
18, 17, 19,
20, 21, 22, // side 6
22, 21, 23,
// create the index buffer
bd.Usage = D3D11_USAGE_DYNAMIC;
bd.ByteWidth = sizeof(DWORD) * 36;
bd.BindFlags = D3D11_BIND_INDEX_BUFFER;
bd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
bd.MiscFlags = 0;
device->CreateBuffer(&bd, NULL, &g_pIBuffer);
pImmediateContext->Map(g_pIBuffer, NULL, D3D11_MAP_WRITE_DISCARD, NULL, &ms); // map the buffer
memcpy(ms.pData, OurIndices, sizeof(OurIndices)); // copy the data
pImmediateContext->Unmap(g_pIBuffer, NULL);
//Load wood texture
D3DX11CreateShaderResourceViewFromFile(device, //Direct3D Device
L"Wood.png", //Load wood.png
NULL, //no additional information
NULL, //no multithreading
&woodTexture, //Address of the shader-resource-view
NULL); //no multithreading
//Load brick texture
D3DX11CreateShaderResourceViewFromFile(device, //Direct3D Device
L"Bricks.png", //Load bricks.png
NULL, //no additional information
NULL, //no multithreading
&brickTexture, //Address of the shader-resource-view
NULL); //no multithreading

HRESULT Object::InitObject(ID3D11Device * device, ID3D11DeviceContext * pImmediateContext)

// Compile the vertex shader
ID3D10Blob* pVSBlob = NULL;
hr = D3DX11CompileFromFile(L"Shader.fx", 0, 0, "VShader", "vs_5_0", 0, 0, 0, &pVSBlob, 0, 0);

//Error Handling
if( FAILED( hr ) )
MessageBox( NULL,
L"The FX file cannot be compiled. Please run this executable from the directory that contains the FX file.", L"Error", MB_OK );
return hr;

// Create the vertex shader
hr = device->CreateVertexShader( pVSBlob->GetBufferPointer(), pVSBlob->GetBufferSize(), NULL, &g_pVertexShader );
if( FAILED( hr ) )
return hr;
// Compile the pixel shader
ID3D10Blob* pPSBlob = NULL;
D3DX11CompileFromFile(L"Shader.fx", 0, 0, "PShader", "ps_5_0", 0, 0, 0, &pPSBlob, 0, 0);
//Error handling
if( FAILED( hr ) )
MessageBox( NULL,
L"The FX file cannot be compiled. Please run this executable from the directory that contains the FX file.", L"Error", MB_OK );
return hr;
// Create the pixel shader
hr = device->CreatePixelShader( pPSBlob->GetBufferPointer(), pPSBlob->GetBufferSize(), NULL, &g_pPixelShader );
if( FAILED( hr ) )
return hr;
//Allows the Shader to return a struct of values
{"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0}, //Allows Pixel shader to take in positions
{"NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0}, //Allows Pixel shader to take in normals
{"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0}, //Allows pixel shader to take in textures
UINT numElements = ARRAYSIZE( layout ); //Count number of elements in array
// Create the input layout
hr = device->CreateInputLayout( layout, numElements, pVSBlob->GetBufferPointer(),
pVSBlob->GetBufferSize(), &g_pVertexLayout );
if( FAILED( hr ) )
return hr;
// Set the input layout
pImmediateContext->IASetInputLayout( g_pVertexLayout );
ZeroMemory( &bd, sizeof(bd) );
bd.Usage = D3D11_USAGE_DEFAULT;
bd.ByteWidth = 176;
//Create Constant Buffer
device->CreateBuffer(&bd, NULL, &g_pCBuffer);
//Setup Constant Buffer
pImmediateContext->VSSetConstantBuffers(0, 1, &g_pCBuffer);
return hr;

void Object::InitStates(ID3D11Device * device)
rd.FillMode = D3D11_FILL_SOLID;
rd.CullMode = D3D11_CULL_BACK;
rd.FrontCounterClockwise = FALSE;
rd.DepthClipEnable = TRUE;
rd.ScissorEnable = FALSE;
rd.AntialiasedLineEnable = FALSE;
rd.MultisampleEnable = FALSE;
rd.DepthBias = 0;
rd.DepthBiasClamp = 0.0f;
rd.SlopeScaledDepthBias = 0.0f;
device->CreateRasterizerState(&rd, &g_pRSDefault);
sd.MaxAnisotropy = 16;
sd.ComparisonFunc = D3D11_COMPARISON_ALWAYS;
sd.BorderColor[0] = 0.0f;
sd.BorderColor[1] = 0.0f;
sd.BorderColor[2] = 0.0f;
sd.BorderColor[3] = 0.0f;
sd.MinLOD = 0.0f;
sd.MaxLOD = D3D11_FLOAT32_MAX;
sd.MipLODBias = 0.0f;
device->CreateSamplerState(&sd, &g_pSamplerState[0]);
device->CreateSamplerState(&sd, &g_pSamplerState[1]);
sd.MinLOD = 5.0f;
device->CreateSamplerState(&sd, &g_pSamplerState[2]);

void Object::CleanupObject()
//Close and release all existing COM Objects
if( g_pVertexBuffer ) g_pVertexBuffer->Release();
if( g_pVertexLayout ) g_pVertexLayout->Release();
if( g_pVertexShader ) g_pVertexShader->Release();
if( g_pPixelShader ) g_pPixelShader->Release();
if( g_pCBuffer ) g_pCBuffer->Release();
if( g_pIBuffer ) g_pIBuffer->Release();
if( woodTexture ) woodTexture->Release();
if( brickTexture ) brickTexture->Release();

//Created by Tim Lawton 2012
// Vertex Shader
//Constant Buffer
cbuffer ConstantBuffer
float4x4 final; //4x4 matrix which holds the final value
float4x4 rotation; //rotation matrix
float4 lightvec; //Light's Vector
float4 lightcol; //light's colour
float4 ambientcol; //Ambient light's colour
Texture2D Texture;
SamplerState ss;
//Struct to return two values
struct VOut
float4 color : COLOR;
float2 texcoord : TEXCOORD;
float4 position : SV_POSITION;

VOut VShader(float4 position : POSITION, float4 normal : NORMAL, float2 texcoord : TEXCOORD)
VOut output;
output.position = mul(final, position);
// set the ambient light
output.color = ambientcol;
// calculate the diffuse light and add it to the ambient light
float4 norm = normalize(mul(rotation, normal));
float diffusebrightness = saturate(dot(norm, lightvec));
output.color += lightcol * diffusebrightness;
//Set texture coordinates
output.texcoord = texcoord;
return output;
// Pixel Shader
float4 PShader(float4 color : COLOR, float2 texcoord : TEXCOORD) : SV_TARGET
return color * Texture.Sample(ss, texcoord);

Any help would be greatly appreciated

Share this post

Link to post
Share on other sites
Have you checked your vertex buffer with PIX. The problem may be related to the texture coordinates and PIX will show you if the buffer contains correct values.
Have you enabled your debug runtime? It should show some error message if there is a problem.

I think that the obvious problem with the code is that the output of the vertex shader doesn't match the input of the pixel shader. You should use the VOut as input parameter to the pixel shader to prevent such a mismatch.

Cheers! Edited by kauna

Share this post

Link to post
Share on other sites
Something like this:

float4 PShader(in VOut Input) : SV_TARGET
return Input.color * Texture.Sample(ss, Input.texcoord);

Cheers! Edited by kauna

Share this post

Link to post
Share on other sites
lol Ive fixed it. turns out I was still using

D3DXCOLOR in my VERTEX Struct, instead of D3DXVECTOR3 for my Normal...

sigh.. Edited by Xuchilbara

Share this post

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

  • Advertisement
  • Advertisement
  • Popular Now

  • Advertisement
  • Similar Content

    • By AxeGuywithanAxe
      I wanted to see how others are currently handling descriptor heap updates and management.
      I've read a few articles and there tends to be three major strategies :
      1 ) You split up descriptor heaps per shader stage ( i.e one for vertex shader , pixel , hull, etc)
      2) You have one descriptor heap for an entire pipeline
      3) You split up descriptor heaps for update each update frequency (i.e EResourceSet_PerInstance , EResourceSet_PerPass , EResourceSet_PerMaterial, etc)
      The benefits of the first two approaches is that it makes it easier to port current code, and descriptor / resource descriptor management and updating tends to be easier to manage, but it seems to be not as efficient.
      The benefits of the third approach seems to be that it's the most efficient because you only manage and update objects when they change.
    • By evelyn4you
      until now i use typical vertexshader approach for skinning with a Constantbuffer containing the transform matrix for the bones and an the vertexbuffer containing bone index and bone weight.
      Now i have implemented realtime environment  probe cubemaping so i have to render my scene from many point of views and the time for skinning takes too long because it is recalculated for every side of the cubemap.
      For Info i am working on Win7 an therefore use one Shadermodel 5.0 not 5.x that have more options, or is there a way to use 5.x in Win 7
      My Graphic Card is Directx 12 compatible NVidia GTX 960
      the member turanszkij has posted a good for me understandable compute shader. ( for Info: in his engine he uses an optimized version of it )
      Now my questions
       is it possible to feed the compute shader with my orignial vertexbuffer or do i have to copy it in several ByteAdressBuffers as implemented in the following code ?
        the same question is about the constant buffer of the matrixes
       my more urgent question is how do i feed my normal pipeline with the result of the compute Shader which are 2 RWByteAddressBuffers that contain position an normal
      for example i could use 2 vertexbuffer bindings
      1 containing only the uv coordinates
      2.containing position and normal
      How do i copy from the RWByteAddressBuffers to the vertexbuffer ?
      (Code from turanszkij )
      Here is my shader implementation for skinning a mesh in a compute shader:
      1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 struct Bone { float4x4 pose; }; StructuredBuffer<Bone> boneBuffer;   ByteAddressBuffer vertexBuffer_POS; // T-Pose pos ByteAddressBuffer vertexBuffer_NOR; // T-Pose normal ByteAddressBuffer vertexBuffer_WEI; // bone weights ByteAddressBuffer vertexBuffer_BON; // bone indices   RWByteAddressBuffer streamoutBuffer_POS; // skinned pos RWByteAddressBuffer streamoutBuffer_NOR; // skinned normal RWByteAddressBuffer streamoutBuffer_PRE; // previous frame skinned pos   inline void Skinning(inout float4 pos, inout float4 nor, in float4 inBon, in float4 inWei) {  float4 p = 0, pp = 0;  float3 n = 0;  float4x4 m;  float3x3 m3;  float weisum = 0;   // force loop to reduce register pressure  // though this way we can not interleave TEX - ALU operations  [loop]  for (uint i = 0; ((i &lt; 4) &amp;&amp; (weisum&lt;1.0f)); ++i)  {  m = boneBuffer[(uint)inBon].pose;  m3 = (float3x3)m;   p += mul(float4(pos.xyz, 1), m)*inWei;  n += mul(nor.xyz, m3)*inWei;   weisum += inWei;  }   bool w = any(inWei);  pos.xyz = w ? p.xyz : pos.xyz;  nor.xyz = w ? n : nor.xyz; }   [numthreads(1024, 1, 1)] void main( uint3 DTid : SV_DispatchThreadID ) {  const uint fetchAddress = DTid.x * 16; // stride is 16 bytes for each vertex buffer now...   uint4 pos_u = vertexBuffer_POS.Load4(fetchAddress);  uint4 nor_u = vertexBuffer_NOR.Load4(fetchAddress);  uint4 wei_u = vertexBuffer_WEI.Load4(fetchAddress);  uint4 bon_u = vertexBuffer_BON.Load4(fetchAddress);   float4 pos = asfloat(pos_u);  float4 nor = asfloat(nor_u);  float4 wei = asfloat(wei_u);  float4 bon = asfloat(bon_u);   Skinning(pos, nor, bon, wei);   pos_u = asuint(pos);  nor_u = asuint(nor);   // copy prev frame current pos to current frame prev pos streamoutBuffer_PRE.Store4(fetchAddress, streamoutBuffer_POS.Load4(fetchAddress)); // write out skinned props:  streamoutBuffer_POS.Store4(fetchAddress, pos_u);  streamoutBuffer_NOR.Store4(fetchAddress, nor_u); }  
    • By mister345
      Hi, can someone please explain why this is giving an assertion EyePosition!=0 exception?
      _lightBufferVS->viewMatrix = DirectX::XMMatrixLookAtLH(XMLoadFloat3(&_lightBufferVS->position), XMLoadFloat3(&_lookAt), XMLoadFloat3(&up));
      It looks like DirectX doesnt want the 2nd parameter to be a zero vector in the assertion, but I passed in a zero vector with this exact same code in another program and it ran just fine. (Here is the version of the code that worked - note XMLoadFloat3(&m_lookAt) parameter value is (0,0,0) at runtime - I debugged it - but it throws no exceptions.
          m_viewMatrix = DirectX::XMMatrixLookAtLH(XMLoadFloat3(&m_position), XMLoadFloat3(&m_lookAt), XMLoadFloat3(&up)); Here is the repo for the broken code (See LightClass) https://github.com/mister51213/DirectX11Engine/blob/master/DirectX11Engine/LightClass.cpp
      and here is the repo with the alternative version of the code that is working with a value of (0,0,0) for the second parameter.
    • By mister345
      Hi, can somebody please tell me in clear simple steps how to debug and step through an hlsl shader file?
      I already did Debug > Start Graphics Debugging > then captured some frames from Visual Studio and
      double clicked on the frame to open it, but no idea where to go from there.
      I've been searching for hours and there's no information on this, not even on the Microsoft Website!
      They say "open the  Graphics Pixel History window" but there is no such window!
      Then they say, in the "Pipeline Stages choose Start Debugging"  but the Start Debugging option is nowhere to be found in the whole interface.
      Also, how do I even open the hlsl file that I want to set a break point in from inside the Graphics Debugger?
      All I want to do is set a break point in a specific hlsl file, step thru it, and see the data, but this is so unbelievably complicated
      and Microsoft's instructions are horrible! Somebody please, please help.

    • By mister345
      I finally ported Rastertek's tutorial # 42 on soft shadows and blur shading. This tutorial has a ton of really useful effects and there's no working version anywhere online.
      Unfortunately it just draws a black screen. Not sure what's causing it. I'm guessing the camera or ortho matrix transforms are wrong, light directions, or maybe texture resources not being properly initialized.  I didnt change any of the variables though, only upgraded all types and functions DirectX3DVector3 to XMFLOAT3, and used DirectXTK for texture loading. If anyone is willing to take a look at what might be causing the black screen, maybe something pops out to you, let me know, thanks.
      Also, for reference, here's tutorial #40 which has normal shadows but no blur, which I also ported, and it works perfectly.
  • Advertisement