Initial pass at pointsprites. Needs a lot more work.
This commit is contained in:
parent
ea5a6e19dd
commit
58504d8c0b
|
@ -135,6 +135,43 @@ D3D11PointSpriteGeometryShader::~D3D11PointSpriteGeometryShader() {
|
|||
|
||||
int D3D11PointSpriteGeometryShader::Generate(D3D11VertexShader* vertex_shader,
|
||||
alloy::StringBuffer* output) {
|
||||
// TODO(benvanik): fetch default point size from register and use that if
|
||||
// the VS doesn't write oPointSize.
|
||||
// TODO(benvanik): clamp to min/max.
|
||||
// TODO(benvanik): figure out how to see which interpolator gets adjusted.
|
||||
|
||||
output->Append(
|
||||
"struct VERTEX {\n"
|
||||
" float4 oPos : SV_POSITION;\n");
|
||||
auto alloc_counts = vertex_shader->alloc_counts();
|
||||
if (alloc_counts.params) {
|
||||
output->Append(
|
||||
" float4 o[%d] : XE_O;\n",
|
||||
D3D11Shader::MAX_INTERPOLATORS);
|
||||
}
|
||||
output->Append(
|
||||
" float4 oPointSize : PSIZE;\n"
|
||||
"};\n");
|
||||
|
||||
output->Append(
|
||||
"[maxvertexcount(4)]\n"
|
||||
"void main(point VERTEX input[1], inout TriangleStream<VERTEX> output) {\n"
|
||||
" const float2 offsets[4] = {\n"
|
||||
" float2(-1.0, 1.0),\n"
|
||||
" float2( 1.0, 1.0),\n"
|
||||
" float2(-1.0, -1.0),\n"
|
||||
" float2( 1.0, -1.0),\n"
|
||||
" };\n"
|
||||
" float psize = max(input[0].oPointSize.x, 1.0);\n"
|
||||
" VERTEX v;\n"
|
||||
" for (uint n = 0; n < 4; n++) {\n"
|
||||
" v = input[0];\n"
|
||||
" v.oPos.xy += offsets[n] * psize;\n"
|
||||
" output.Append(v);\n"
|
||||
" }\n"
|
||||
" output.RestartStrip();\n"
|
||||
"}\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -139,12 +139,12 @@ int D3D11GraphicsDriver::SetupDraw(XE_GPU_PRIMITIVE_TYPE prim_type) {
|
|||
switch (prim_type) {
|
||||
case XE_GPU_PRIMITIVE_TYPE_POINT_LIST:
|
||||
primitive_topology = D3D_PRIMITIVE_TOPOLOGY_POINTLIST;
|
||||
//if (state_.vertex_shader) {
|
||||
// if (state_.vertex_shader->DemandGeometryShader(
|
||||
// D3D11VertexShader::POINT_SPRITE_SHADER, &geometry_shader)) {
|
||||
// return 1;
|
||||
// }
|
||||
//}
|
||||
if (state_.vertex_shader) {
|
||||
if (state_.vertex_shader->DemandGeometryShader(
|
||||
D3D11VertexShader::POINT_SPRITE_SHADER, &geometry_shader)) {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case XE_GPU_PRIMITIVE_TYPE_LINE_LIST:
|
||||
primitive_topology = D3D_PRIMITIVE_TOPOLOGY_LINELIST;
|
||||
|
|
Loading…
Reference in New Issue