shader storage buffer
DEFINE POINTER name=buffer_1394, type=uint, count=1, data=imm{null};
glGenBuffers(1, buffer_1394);
glBindBuffer(GL_SHADER_STORAGE_BUFFER, buffer_1394[0]);
DEFINE POINTER name=ssb_0, type=ubyte, count=2980, data=file{NULL};
glBufferData(GL_SHADER_STORAGE_BUFFER, 2980, ssb_0, GL_DYNAMIC_COPY);
glBindBufferBase(GL_SHADER_STORAGE_BUFFER, 0, buffer_1394[0]);
shader 里的用法:
layout(std430, binding = 0) buffer tess_buffer_layout
{
float TessLevelOuter[100];
} ts_buffer;
uniform buffer:
DEFINE POINTER name=buffer_0, type=uint, count=1, data=imm{null};
glGenBuffers(1, buffer_0);
glBindBuffer(GL_UNIFORM_BUFFER, buffer_0[0]);
DEFINE POINTER name=buffer_1, type=ubyte, count=608, data=file{buffer_1.bin};
glBufferData(GL_UNIFORM_BUFFER, 608, buffer_1, GL_STREAM_DRAW);
glBindBufferBase(GL_UNIFORM_BUFFER, 1, buffer_0[0]);
glBindBuffer(GL_UNIFORM_BUFFER, buffer_0[0]);
DEFINE POINTER name=buffer_77, type=ubyte, count=608, data=file{buffer_77.bin};
glBufferSubData(GL_UNIFORM_BUFFER, 0, 608, buffer_77);
shader 用法:
layout(std140, binding=1) uniform
#else
struct
#endif
TessellationParams
{
float innerTessFactor;
float outerTessFactor;
float noiseFreq;
int noiseOctaves;
float invNoiseSize;
float invNoise3DSize;
float heightScale;
float triSize;
SDK_VEC4 viewport;
SDK_MAT4 ModelView;
SDK_MAT4 ModelViewProjection;
SDK_MAT4 Projection;
SDK_MAT4 InvProjection;
SDK_MAT4 InvView;
SDK_BOOL smoothNormals;
SDK_BOOL cull;
SDK_BOOL lod;
SDK_VEC3 lightDir;
SDK_VEC3 lightDirWorld;
SDK_VEC4 eyePosWorld;
SDK_VEC4 frustumPlanes[6];
float time;
SDK_VEC2 translate;
int gridW, gridH;
SDK_VEC3 tileSize;
SDK_VEC3 gridOrigin;
float tileBoundingSphereR;
float invFocalLen;
#ifdef CPP
TessellationParams() :
innerTessFactor(32.0f),
outerTessFactor(32.0f),
noiseFreq(0.25f),
heightScale(1.5f),
noiseOctaves(8),
triSize(5.0f),
cull(true),
lod(true),
lightDir(0.0f, 0.0f, -1.0f),
time(0.0f),
gridOrigin(-8.0f, 0.0f, -8.0f),
gridW(16), gridH(16),
tileSize(1.0f, 0.0f, 1.0f)
{
nv::vec3f halfTileSize = nv::vec3f(tileSize.x, heightScale, tileSize.z)*0.5f;
tileBoundingSphereR = length(halfTileSize);
}
#endif
};