Jump to content

  • Log In with Google      Sign In   
  • Create Account


How to add "intrinsic" material color to this pixel shader?


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
5 replies to this topic

#1 lucky6969b   Members   -  Reputation: 530

Like
0Likes
Like

Posted 14 January 2013 - 10:46 PM

//Transformation Matrices
matrix matW;
matrix matVP;

//World Light Position
float3 lightPos;

//Texture
texture texDiffuse;

//Sampler
sampler DiffuseSampler = sampler_state
{
   Texture = (texDiffuse);
   MinFilter = Linear;   MagFilter = Linear;   MipFilter = Linear;
   AddressU  = Wrap;     AddressV  = Wrap;     AddressW  = Wrap;
   MaxAnisotropy = 16;
};

//Vertex Input
struct VS_INPUT
{
     float4 position : POSITION0;
     float3 normal   : NORMAL;
     float2 tex0     : TEXCOORD0;
};

//Vertex Output / Pixel Shader Input
struct VS_OUTPUT
{
     float4 position : POSITION0;
     float2 tex0     : TEXCOORD0;
     float  shade	 : TEXCOORD1;
};

//Vertex Shader
VS_OUTPUT vs_lighting(VS_INPUT IN)
{
	VS_OUTPUT OUT = (VS_OUTPUT)0;

    //getting the position of the vertex in the world
    float4 posWorld = mul(IN.position, matW);
	float4 normal = normalize(mul(IN.normal, matW));
	 
	//getting to position to object space
	OUT.position = mul(posWorld, matVP);
	 
    OUT.shade = max(dot(normal, normalize(lightPos - posWorld)), 0.2f);
    
    OUT.tex0 = IN.tex0;
    
    return OUT;
}

//Pixel Shader
float4 ps_lighting(VS_OUTPUT IN) : COLOR0
{
	float4 color = tex2D(DiffuseSampler, IN.tex0);
	return color * IN.shade;
}

//Lighting Technique
technique Lighting
{
	pass P0
	{        
		Lighting = false;
		
		VertexShader = compile vs_2_0 vs_lighting();
		PixelShader  = compile ps_2_0 ps_lighting();
	}
}

This currently samples the texture color and intermixes it with the shade color based on the lightPos and some constants.
I want to add something like material colors or vertex colors to be some basic colors of the mesh.
Any ideas?
Thanks
Jack

Sponsor:

#2 TiagoCosta   Crossbones+   -  Reputation: 1845

Like
0Likes
Like

Posted 15 January 2013 - 03:50 AM

If you just need a constant material color:
Just add a new float4 constant to the shader and store the material color in that constant.
Then multiply it with the ouput of the pixel shader.
return color * IN.shade * mat_color;
If the material color varies bake it into the diffuse color texture or add a second texture to the shader, sample it like the diffuse texture and multiply with the output.

Edited by TiagoCosta, 15 January 2013 - 03:51 AM.

Tiago Costa
Aqua Engine - my DirectX 11 game "engine" - In development

#3 lucky6969b   Members   -  Reputation: 530

Like
0Likes
Like

Posted 15 January 2013 - 04:27 AM

Thanks, I gave up the texture values, cos I don't make one yet.
However, when I am doing this
return IN.shade * materialColor;

The rendered output is extremely jagged.
How can I improve that?

Update:

 

void Application::Update(float deltaTime)
{
    try
    {
        //Check for lost device
        HRESULT coop = g_pDevice->TestCooperativeLevel();
        if(coop != D3D_OK)
        {
            if(coop == D3DERR_DEVICELOST)
            {
                if(m_deviceLost == false)
                    DeviceLost();        
            }
            else if(coop == D3DERR_DEVICENOTRESET)
            {
                if(m_deviceLost == true)
                    DeviceGained();
            }
            Sleep(100);
            return;
        }
        m_deltaTime = deltaTime * 0.4f;
        //Keyboard input
        if(KeyDown(VK_ESCAPE))
        {
            Quit();
        }
        if(KeyDown(VK_RETURN) && KeyDown(18))        //ALT + RETURN
        {
            //Switch between windowed mode and fullscreen mode
            m_present.Windowed = !m_present.Windowed;
            DeviceLost();
            DeviceGained();
            if(m_present.Windowed)
            {
                RECT rc = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT};
                AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, false);
                SetWindowPos(m_mainWindow, HWND_NOTOPMOST, 0, 0, rc.right - rc.left, rc.bottom - rc.top, SWP_SHOWWINDOW);
                UpdateWindow(m_mainWindow);
            }
        }
        //Toggle Animation
        if(KeyDown(VK_RETURN))
        {
            Sleep(300);
            RandomizeAnimations();
        }
    }
    catch(...)
    {
        g_debug << "Error in Application::Update() \n";
    }
}  

 

 

void Application::DeviceLost()
{
	try
	{
		g_pFont->OnLostDevice();
		g_pEffect->OnLostDevice();
		m_deviceLost = true;
	}
	catch(...)
	{
		g_debug << "Error occured in Application::DeviceLost() \n";
	}
}

void Application::DeviceGained()
{
	try
	{
		g_pDevice->Reset(&m_present);
		g_pFont->OnResetDevice();
		g_pEffect->OnResetDevice();
		m_deviceLost = false;
	}
	catch(...)
	{
		g_debug << "Error occured in Application::DeviceGained() \n";
	}
}

I copied the code from a book. So this presentation parameters are the same when the device is regained.
 

void Application::DeviceGained()
{
	try
	{ 
		g_pDevice->Reset(&m_present);
		g_pFont->OnResetDevice();
		g_pEffect->OnResetDevice();
		m_deviceLost = false;
	}
	catch(...)
	{
		g_debug << "Error occured in Application::DeviceGained() \n";
	}
}


 
Thanks
Jack
 


Edited by lucky6969b, 15 January 2013 - 04:52 AM.


#4 TiagoCosta   Crossbones+   -  Reputation: 1845

Like
0Likes
Like

Posted 15 January 2013 - 05:36 AM

What you mean jagged? Can you post a screenshot?

 

You should think about switching to per-pixel lighting using Blinn-Phong, I'm guessing that's the problem...


Tiago Costa
Aqua Engine - my DirectX 11 game "engine" - In development

#5 lucky6969b   Members   -  Reputation: 530

Like
0Likes
Like

Posted 15 January 2013 - 08:01 PM

Just feels like as ugly as this image. The edges of the mesh become really jagged when being maximized (windowed mode) only

I have set the default BackBufferHeight + width = 800x600, that is when maximized to 1280x1024

Attached Thumbnails

  • jagged.png

Edited by lucky6969b, 15 January 2013 - 11:10 PM.


#6 lucky6969b   Members   -  Reputation: 530

Like
0Likes
Like

Posted 16 January 2013 - 12:19 AM

Just feels like as ugly as this image. The edges of the mesh become really jagged when being maximized (windowed mode) only

I have set the default BackBufferHeight + width = 800x600, that is when maximized to 1280x1024

 

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch( msg )
    {
        case WM_CREATE:
            break;
        case WM_SIZE:
            if( g_pDevice != NULL && wParam != SIZE_MINIMIZED )
            {
//                invalidateDeviceObjects();
                g_present.BackBufferWidth = LOWORD(lParam);
                g_present.BackBufferHeight = HIWORD(lParam);
                HRESULT hr = g_pDevice->Reset( &g_present );
                if( FAILED(hr) )
                {
                    MessageBox( NULL, "Call to Reset() failed with D3DERR_INVALIDCALL! ",
                        "ERROR", MB_OK | MB_ICONEXCLAMATION );
                }
            }
            break;
        case WM_DESTROY:
            ::PostQuitMessage(0);
            break;            
    }
    return ::DefWindowProc(hwnd, msg, wParam, lParam);
}

The error message "Call to Reset()..." is always used.

Thanks

Jack






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS