-
Notifications
You must be signed in to change notification settings - Fork 441
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Some trouble with LineGL3D shader when camera is close #634
Comments
Hello -- I already replied on Gitter, but replying here as well to not make it look like I'm ignoring this. Artifacts with the near clip plane are a problem I'm aware of and on my list of things to fix. Enabling GL::Renderer::Feature::DepthClamp should help with that, at least in most cases. I looked around and discovered that it's now also available on WebGL, so with bb4064b you should be able to use it there as well. I'll comment here once I get back to investigating this. |
I was experimenting with the engine for the first time, when i ran into this issue. Specially with the near frustum plane. Fixed by clamping the line 410 in Line.vert as per comment -1 to 1 highp const vec2 screenspaceLineDirection = clamp(lineDirection*viewportSize/2.0,-1.0,1.0); DepthClamp wont help as per note: "What is unclipped are objects between the projection near-plane and the camera" https://www.khronos.org/opengl/wiki/Vertex_Post-Processing#Depth_clamping Still not perfect but 99% better. Also I would like to contribute this code for drawing conic sections, based on polar formula, very much based on circle3DWireframe(). constexpr Trade::MeshAttributeData AttributeData3DWireframe[]{
Trade::MeshAttributeData{Trade::MeshAttribute::Position, VertexFormat::Vector3,
0, 0, sizeof(Vector3)}
};
Trade::MeshData ViewerExample::conic3DWireframe(const float semilattus, const float eccentricity, const UnsignedInt segments) {
CORRADE_ASSERT(segments >= 3, "Primitives::conic3DWireframe(): segments must be >= 3",
(Trade::MeshData{MeshPrimitive::LineLoop, 0}));
Containers::Array<char> vertexData{segments*sizeof(Vector3)};
auto positions = Containers::arrayCast<Vector3>(vertexData);
Rad phi = Math::acos(-1.0f/eccentricity);
Rad phi2 = 2.0f*phi;
/* Points on conic */
const Rad angleIncrement(eccentricity >= 1.0f? phi2/segments : Rad(Constants::tau()/segments));
for(UnsignedInt i = 0; i != segments; ++i) {
const Rad angle(eccentricity >= 1.0f? (Float(i)*angleIncrement-phi):Float(i)*angleIncrement);
if(eccentricity >= 1.0f && angle>=phi)
break;
const Containers::Pair<Float, Float> sincos = Math::sincos(angle);
float r = semilattus/(1+eccentricity*sincos.second());
positions[i] = {r*sincos.second(), r*sincos.first(), 0.0f};
}
//cap the "inf ends"
if(eccentricity >= 1.0f) {
positions[0] = positions[1];
positions[segments-1] = positions[segments-2];
}
return Trade::MeshData{MeshPrimitive::LineLoop, Utility::move(vertexData),
Trade::meshAttributeDataNonOwningArray(AttributeData3DWireframe), UnsignedInt(positions.size())};
} |
Wow, thanks for both the fix suggestion and the code. I'll integrate both as soon as I get a chance, things piled up quite a bit over the weekend :) |
I toyed around with the LineGL3D shader to render a simple debug grid:
The trouble is, when I zoom in close to the grid, the window gets filled with some artifacts:
I am just using the default LineGL3D shader with no special config.
Below is the code that generates the line objects and attaches the drawables:
And the drawable itself:
Generator for the debug line mesh:
In terms of scale: The lines themselves are 2 units long (-1.0 to 1.0 on their respective axes). They are parented to an Object3D that has a scale factor of 100 in all dimensions. That Object3D is parented to another object that has a scale factor of 0.05. The overall hierarchy is:
[scene manipulator] <- [world object (0.05x)] <- [debug lines object (100x)] <- [the lines]
The camera projection matrix is defined by
.setProjectionMatrix(Matrix4::perspectiveProjection(35.0_degf, 1.0f, 0.1f, 1000.0f))
I tried increasing my near plane from 0.1f to 1.0f since I read this helps with z-buffer artifacts, and it doesn't eliminate the issue, just changes it:
Is there something I'm doing wrong with using the shader? I've tried changing the number of points / line (ideally I'd just use 2, but I tried varying it in case it made a difference. Here I'm using 11 points.)
The text was updated successfully, but these errors were encountered: