#c #c #syntax
#c #c #синтаксис
Вопрос:
Что sampler2D texture0 : DEFINESAMPLER(0);
делает? Он взят из заголовка внутри каталога игры. Меня смущает использование двоеточия.
Редактировать: Больше контекста, как и было запрошено.
На самом деле больше не о чем упоминать в контексте. Строка взята из файла ресурсы/шейдеры/ShaderMacros.h из игры под названием Super Meat Boy (по крайней мере, в Steam-версии). Заголовок просто содержит кучу объявлений, подобных тому, которое я упомянул выше:
/**
Defines for profile specific compiling
*/
#define DEFINEFLOATCONSTANT(x) register(c##x)
#define HardwareInstanceTrans float4x4 matInstanceTransform : TEXCOORD1
#define HardwareInstanceTexCoordOffset float4 vInstanceTexCoordOffset : TEXCOORD5
#ifdef SHADER_DX
#define matrixmul(mat, pos) mul(pos, mat)
#else
#define matrixmul(mat, pos) mul(mat, pos)
#endif
#define DEFINESAMPLER(x) register(s##x)
/*************************************************************
SAMPLERS
*************************************************************/
sampler2D texture0 : DEFINESAMPLER(0);
sampler2D texture1 : DEFINESAMPLER(1);
sampler2D texture2 : DEFINESAMPLER(2);
sampler2D texture3 : DEFINESAMPLER(3);
sampler2D texture4 : DEFINESAMPLER(4);
sampler2D texture5 : DEFINESAMPLER(5);
sampler2D texture6 : DEFINESAMPLER(6);
sampler2D texture7 : DEFINESAMPLER(7);
sampler2D texture8 : DEFINESAMPLER(8);
sampler2D texture9 : DEFINESAMPLER(9);
sampler2D texture10 : DEFINESAMPLER(10);
sampler2D texture11 : DEFINESAMPLER(11);
sampler2D texture12 : DEFINESAMPLER(12);
sampler2D texture13 : DEFINESAMPLER(13);
sampler2D texture14 : DEFINESAMPLER(14);
sampler2D texture15 : DEFINESAMPLER(15);
/*************************************************************
VERTEX SHADER CONSTANTS
*
************************************************************/
float4x4 matWorld : DEFINEFLOATCONSTANT(0); //Uses 4 registers
#ifdef SHADER_DX
float3x4 mat3x4TexGen0 : DEFINEFLOATCONSTANT(4); //Uses 3 registers
float3x4 mat3x4TexGen1 : DEFINEFLOATCONSTANT(7); //Uses 3 registers
float3x4 mat3x4TexGen2 : DEFINEFLOATCONSTANT(10); //Uses 3 registers
float3x4 mat3x4TexGen3 : DEFINEFLOATCONSTANT(13); //Uses 3 registers
float3x4 mat3x4TexGen4 : DEFINEFLOATCONSTANT(16); //Uses 3 registers
float3x4 mat3x4TexGen5 : DEFINEFLOATCONSTANT(19); //Uses 3 registers
float3x4 mat3x4TexGen6 : DEFINEFLOATCONSTANT(22); //Uses 3 registers
float3x4 mat3x4TexGen7 : DEFINEFLOATCONSTANT(25); //Uses 3 registers
float3x4 mat2x4TexGen0 : DEFINEFLOATCONSTANT(28); //Uses 2 registers
float3x4 mat2x4TexGen1 : DEFINEFLOATCONSTANT(30); //Uses 2 registers
float3x4 mat2x4TexGen2 : DEFINEFLOATCONSTANT(32); //Uses 2 registers
float3x4 mat2x4TexGen3 : DEFINEFLOATCONSTANT(34); //Uses 2 registers
float3x4 mat2x4TexGen4 : DEFINEFLOATCONSTANT(36); //Uses 2 registers
float3x4 mat2x4TexGen5 : DEFINEFLOATCONSTANT(38); //Uses 2 registers
float3x4 mat2x4TexGen6 : DEFINEFLOATCONSTANT(40); //Uses 2 registers
float3x4 mat2x4TexGen7 : DEFINEFLOATCONSTANT(42); //Uses 2 registers
#else
/** Texture coord generation matricies */
float4x3 mat3x4TexGen0 : DEFINEFLOATCONSTANT(4); //Uses 3 registers
float4x3 mat3x4TexGen1 : DEFINEFLOATCONSTANT(7); //Uses 3 registers
float4x3 mat3x4TexGen2 : DEFINEFLOATCONSTANT(10); //Uses 3 registers
float4x3 mat3x4TexGen3 : DEFINEFLOATCONSTANT(13); //Uses 3 registers
float4x3 mat3x4TexGen4 : DEFINEFLOATCONSTANT(16); //Uses 3 registers
float4x3 mat3x4TexGen5 : DEFINEFLOATCONSTANT(19); //Uses 3 registers
float4x3 mat3x4TexGen6 : DEFINEFLOATCONSTANT(22); //Uses 3 registers
float4x3 mat3x4TexGen7 : DEFINEFLOATCONSTANT(25); //Uses 3 registers
float4x3 mat2x4TexGen0 : DEFINEFLOATCONSTANT(28); //Uses 2 registers
float4x3 mat2x4TexGen1 : DEFINEFLOATCONSTANT(30); //Uses 2 registers
float4x3 mat2x4TexGen2 : DEFINEFLOATCONSTANT(32); //Uses 2 registers
float4x3 mat2x4TexGen3 : DEFINEFLOATCONSTANT(34); //Uses 2 registers
float4x3 mat2x4TexGen4 : DEFINEFLOATCONSTANT(36); //Uses 2 registers
float4x3 mat2x4TexGen5 : DEFINEFLOATCONSTANT(38); //Uses 2 registers
float4x3 mat2x4TexGen6 : DEFINEFLOATCONSTANT(40); //Uses 2 registers
float4x3 mat2x4TexGen7 : DEFINEFLOATCONSTANT(42); //Uses 2 registers
#endif
/***
Graphics Pipeline stuff
*/
//ColorConstant1
float4 cColorConstant1 : DEFINEFLOATCONSTANT(0); //uses 1 register
float4 cColorConstant2 : DEFINEFLOATCONSTANT(1); //uses 1 register
float4 cColorConstant3 : DEFINEFLOATCONSTANT(2); //uses 1 register
float4 vShaderParams : DEFINEFLOATCONSTANT(3); //uses 1 register
float4 cFogColor : DEFINEFLOATCONSTANT(4); //uses 1 register
float4 vFogParams : DEFINEFLOATCONSTANT(5);
#define FOGMAXDIST vFogParams.x //this parameter is CPU calculated as 1 / elementZ. This is only applicable for 2D
#define FOGITEMDIST vFogParams.y //item distance set by the CPU
Комментарии:
1. Как говорит Александр, требуется больше контекста. Проблема в том, что препроцессор C может переопределить, что означают sampler2D, texture0 и DEFINESAMPLER. И, не зная, откуда вы взяли эти имена, мы не можем с пользой комментировать дальше.
2. это не C или Си , это какой-то шейдерный язык.
3. Мне не кажется, что это C или C . Не могли бы вы привести пример того, на что
ShaderMacros.h
ссылается через#include
?4. @unapersson Я добавил весь контекст, который смог предоставить.
5. @AJG85: да, но тогда зачем символ двоеточия?
Ответ №1:
Это не заголовочный файл C или Си . Это файл шейдера HLSL. Короче говоря, sampler2D texture0 : DEFINESAMPLER(0);
инструкция создает текстуру, вводимую в шейдер. Для получения дополнительной информации о HLSL смотрите Документацию MSDN HLSL.
Ответ №2:
Похоже, что файл заголовка предварительно обрабатывается, а затем включается в фактические файлы шейдеров.
sampler2D texture0 : DEFINESAMPLER(0);
Например, расширяется до
sampler2D texture0 : register(s0);
после предварительной обработки. Затем этот сэмплер текстуры присваивается регистру сэмплера 0
. Посмотрите на этот сайт msdn для получения дополнительной информации.