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,
|
int D3D11PointSpriteGeometryShader::Generate(D3D11VertexShader* vertex_shader,
|
||||||
alloy::StringBuffer* output) {
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -139,12 +139,12 @@ int D3D11GraphicsDriver::SetupDraw(XE_GPU_PRIMITIVE_TYPE prim_type) {
|
||||||
switch (prim_type) {
|
switch (prim_type) {
|
||||||
case XE_GPU_PRIMITIVE_TYPE_POINT_LIST:
|
case XE_GPU_PRIMITIVE_TYPE_POINT_LIST:
|
||||||
primitive_topology = D3D_PRIMITIVE_TOPOLOGY_POINTLIST;
|
primitive_topology = D3D_PRIMITIVE_TOPOLOGY_POINTLIST;
|
||||||
//if (state_.vertex_shader) {
|
if (state_.vertex_shader) {
|
||||||
// if (state_.vertex_shader->DemandGeometryShader(
|
if (state_.vertex_shader->DemandGeometryShader(
|
||||||
// D3D11VertexShader::POINT_SPRITE_SHADER, &geometry_shader)) {
|
D3D11VertexShader::POINT_SPRITE_SHADER, &geometry_shader)) {
|
||||||
// return 1;
|
return 1;
|
||||||
// }
|
}
|
||||||
//}
|
}
|
||||||
break;
|
break;
|
||||||
case XE_GPU_PRIMITIVE_TYPE_LINE_LIST:
|
case XE_GPU_PRIMITIVE_TYPE_LINE_LIST:
|
||||||
primitive_topology = D3D_PRIMITIVE_TOPOLOGY_LINELIST;
|
primitive_topology = D3D_PRIMITIVE_TOPOLOGY_LINELIST;
|
||||||
|
|
Loading…
Reference in New Issue