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

Started by
4 comments, last by lucky6969b 11 years, 3 months ago
//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
Advertisement
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.

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

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...

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

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

This topic is closed to new replies.

Advertisement