ClassiCube/misc/windows/D3D11ShaderGen.c

186 lines
11 KiB
C

#define _WIN32_WINNT 0x600
#define COBJMACROS
#include <stdio.h>
#include <d3dcompiler.h>
#define GetBlobPointer ID3D10Blob_GetBufferPointer
#define GetBlobSize ID3D10Blob_GetBufferSize
#pragma comment(lib,"d3dcompiler.lib")
static const char VS_SOURCE[] =
"float4x4 mvpMatrix; \n" \
"#ifdef VS_TEXTURE_OFFSET \n" \
"float2 texOffset; \n" \
"#endif \n" \
" \n" \
"struct INPUT_VERTEX { \n" \
" float3 position : POSITION; \n" \
" float4 color : COLOR0; \n" \
"#ifndef VS_COLOR_ONLY \n" \
" float2 coords : TEXCOORD0; \n" \
"#endif \n" \
"}; \n" \
"struct OUTPUT_VERTEX { \n" \
"#ifndef VS_COLOR_ONLY \n" \
" float2 coords : TEXCOORD0; \n" \
"#endif \n" \
" float4 color : COLOR0; \n" \
" float4 position : VPOS; \n" \
"}; \n" \
" \n" \
"OUTPUT_VERTEX main(INPUT_VERTEX input) { \n" \
" OUTPUT_VERTEX output; \n" \
" // https://stackoverflow.com/questions/16578765/hlsl-mul-variables-clarification \n" \
" output.position = mul(mvpMatrix, float4(input.position, 1.0f)); \n" \
"#ifndef VS_COLOR_ONLY \n" \
" output.coords = input.coords; \n" \
"#endif \n" \
"#ifdef VS_TEXTURE_OFFSET \n" \
" output.coords += texOffset; \n" \
"#endif \n" \
" output.color = input.color; \n" \
" return output; \n" \
"}";
static const char PS_SOURCE[] =
"#ifndef PS_COLOR_ONLY \n" \
"Texture2D texValue; \n" \
"SamplerState texState; \n" \
"#endif \n" \
"#ifdef PS_FOG_LINEAR \n" \
"float fogEnd; \n" \
"float3 fogColor; \n" \
"#endif \n" \
"#ifdef PS_FOG_DENSITY \n" \
"float fogDensity; \n" \
"float3 fogColor; \n" \
"#endif \n" \
" \n" \
"struct INPUT_VERTEX { \n" \
"#ifndef PS_COLOR_ONLY \n" \
" float2 coords : TEXCOORD0; \n" \
"#endif \n" \
" float4 color : COLOR0; \n" \
"#ifdef PS_FOG_LINEAR \n" \
" float4 position : VPOS; \n" \
"#endif \n" \
"#ifdef PS_FOG_DENSITY \n" \
" float4 position : VPOS; \n" \
"#endif \n" \
"}; \n" \
" \n" \
"//float4 main(float2 coords : TEXCOORD0, float4 color : COLOR0) : SV_TARGET {\n" \
"float4 main(INPUT_VERTEX input) : SV_TARGET{ \n" \
" float4 color; \n" \
"#ifdef PS_COLOR_ONLY \n" \
" color = input.color; \n" \
"#else \n" \
" float4 texColor = texValue.Sample(texState, input.coords); \n" \
" color = texColor * input.color; \n" \
"#endif \n" \
" \n" \
"#ifdef PS_ALPHA_TEST \n" \
" // https://jbrd.github.io/2008/02/14/hlsl-discard-doesnt-return.html \n" \
" if (color.a < 0.5) { discard; return color; } \n" \
"#endif \n" \
"#ifdef PS_FOG_LINEAR \n" \
" float depth = input.position.w; \n" \
" float fog = saturate((fogEnd - depth) / fogEnd); \n" \
" color.rgb = lerp(fogColor, color.rgb, fog); \n" \
"#endif \n" \
"#ifdef PS_FOG_DENSITY \n" \
" float depth = input.position.w; \n" \
" float fog = saturate(exp(fogDensity * depth)); \n" \
" color.rgb = lerp(fogColor, color.rgb, fog); \n" \
"#endif \n" \
" return color; \n" \
"}";
static void CompileShader(LPCSTR src, LPCSTR name, LPCSTR profile, const D3D_SHADER_MACRO* defines) {
UINT flags = D3DCOMPILE_ENABLE_STRICTNESS | D3DCOMPILE_OPTIMIZATION_LEVEL1;// | D3DCOMPILE_DEBUG;
ID3DBlob* shaderBlob = NULL;
ID3DBlob* errorBlob = NULL;
HRESULT hr = D3DCompile(src, strlen(src), name, defines, D3D_COMPILE_STANDARD_FILE_INCLUDE,
"main", profile, flags, 0, &shaderBlob, &errorBlob );
if (hr && errorBlob) {
char* errText = (char*)GetBlobPointer(errorBlob);
OutputDebugStringA(errText);
printf("// Compiling %s failed\n", name);
printf("// %s\n", errText);
}
if (hr) {
printf("// Compiling %s failed - %08X\n", name, hr);
return;
}
unsigned char* data = GetBlobPointer(shaderBlob);
SIZE_T size = GetBlobSize(shaderBlob);
printf("static const unsigned char %s[%i] = {\n", name, size);
for (int i = 0; i < size; )
{
int count = min(size - i, 32);
printf("\t");
for (int j = 0; j < count; j++)
{
printf("0x%02x,", data[i + j]);
}
printf("\n");
i += count;
}
printf("};\n");
}
#define CompileVertexShader(name, defines) CompileShader(VS_SOURCE, name, "vs_4_0_level_9_1", defines)
#define CompilePixelShader( name, defines) CompileShader(PS_SOURCE, name, "ps_4_0_level_9_1", defines)
int main() {
const D3D_SHADER_MACRO vs_colored[] = { "VS_COLOR_ONLY","1", NULL,NULL };
const D3D_SHADER_MACRO vs_textured[] = { NULL,NULL };
const D3D_SHADER_MACRO vs_offset[] = { "VS_TEXTURE_OFFSET","1", NULL,NULL };
const D3D_SHADER_MACRO ps_colored[] = { "PS_COLOR_ONLY","1", NULL,NULL };
const D3D_SHADER_MACRO ps_textured[] = { NULL,NULL };
const D3D_SHADER_MACRO ps_colored_test[] = { "PS_COLOR_ONLY","1", "PS_ALPHA_TEST","1", NULL,NULL };
const D3D_SHADER_MACRO ps_textured_test[] = { "PS_ALPHA_TEST","1", NULL,NULL };
const D3D_SHADER_MACRO ps_colored_linear[] = { "PS_FOG_LINEAR","1", "PS_COLOR_ONLY","1", NULL,NULL };
const D3D_SHADER_MACRO ps_textured_linear[] = { "PS_FOG_LINEAR","1", NULL,NULL };
const D3D_SHADER_MACRO ps_colored_test_linear[] = { "PS_FOG_LINEAR","1", "PS_COLOR_ONLY","1", "PS_ALPHA_TEST","1", NULL,NULL };
const D3D_SHADER_MACRO ps_textured_test_linear[] = { "PS_FOG_LINEAR","1", "PS_ALPHA_TEST","1", NULL,NULL };
const D3D_SHADER_MACRO ps_colored_density[] = { "PS_FOG_DENSITY","1", "PS_COLOR_ONLY","1", NULL,NULL };
const D3D_SHADER_MACRO ps_textured_density[] = { "PS_FOG_DENSITY","1", NULL,NULL };
const D3D_SHADER_MACRO ps_colored_test_density[] = { "PS_FOG_DENSITY","1", "PS_COLOR_ONLY","1", "PS_ALPHA_TEST","1", NULL,NULL };
const D3D_SHADER_MACRO ps_textured_test_density[] = { "PS_FOG_DENSITY","1", "PS_ALPHA_TEST","1", NULL,NULL };
printf("// Generated using misc/D3D11ShaderGen.c\n\n");
printf("//########################################################################################################################\n");
printf("//------------------------------------------------------Vertex shaders----------------------------------------------------\n");
printf("//########################################################################################################################\n");
CompileVertexShader("vs_colored", vs_colored);
CompileVertexShader("vs_textured", vs_textured);
CompileVertexShader("vs_textured_offset", vs_offset);
printf("\n\n");
printf("//########################################################################################################################\n");
printf("//------------------------------------------------------Pixel shaders-----------------------------------------------------\n");
printf("//########################################################################################################################\n");
CompilePixelShader("ps_colored", ps_colored);
CompilePixelShader("ps_textured", ps_textured);
CompilePixelShader("ps_colored_test", ps_colored_test);
CompilePixelShader("ps_textured_test", ps_textured_test);
CompilePixelShader("ps_colored_linear", ps_colored_linear);
CompilePixelShader("ps_textured_linear", ps_textured_linear);
CompilePixelShader("ps_colored_test_linear", ps_colored_test_linear);
CompilePixelShader("ps_textured_test_linear", ps_textured_test_linear);
CompilePixelShader("ps_colored_density", ps_colored_density);
CompilePixelShader("ps_textured_density", ps_textured_density);
CompilePixelShader("ps_colored_test_density", ps_colored_test_density);
CompilePixelShader("ps_textured_test_density", ps_textured_test_density);
//Sleep(5000);
return 0;
}