Объясните как сделать правильно.
Создание двух фигур:
private void drawPar(float w, float h, float d)
{
gl.Begin(OpenGL.GL_QUADS);
// +z
gl.Normal(0.0f, 0.0f, 1.0f);
gl.Vertex(-w / 2, -h / 2, -d / 2);
gl.Vertex( w / 2, -h / 2, -d / 2);
gl.Vertex( w / 2, h / 2, -d / 2);
gl.Vertex(-w / 2, h / 2, -d / 2);
// -z
gl.Normal(0.0f, 0.0f, -1.0f);
gl.Vertex(-w / 2, -h / 2, d / 2);
gl.Vertex(-w / 2, h / 2, d / 2);
gl.Vertex( w / 2, h / 2, d / 2);
gl.Vertex( w / 2, -h / 2, d / 2);
// -x
gl.Normal(-1.0f, 0.0f, 0.0f);
gl.Vertex(-w / 2, -h / 2, -d / 2);
gl.Vertex(-w / 2, -h / 2, d / 2);
gl.Vertex(-w / 2, h / 2, d / 2);
gl.Vertex(-w / 2, h / 2, -d / 2);
// x
gl.Normal(1.0f, 0.0f, 0.0f);
gl.Vertex( w / 2, -h / 2, -d / 2);
gl.Vertex( w / 2, h / 2, -d / 2);
gl.Vertex( w / 2, h / 2, d / 2);
gl.Vertex( w / 2, -h / 2, d / 2);
// y
gl.Normal(0.0f, 1.0f, 0.0f);
gl.Vertex(-w / 2, h / 2, -d / 2);
gl.Vertex( w / 2, h / 2, -d / 2);
gl.Vertex( w / 2, h / 2, d / 2);
gl.Vertex(-w / 2, h / 2, d / 2);
// -y
gl.Normal(0.0f, -1.0f, 0.0f);
gl.Vertex(-w / 2, -h / 2, -d / 2);
gl.Vertex(-w / 2, -h / 2, d / 2);
gl.Vertex( w / 2, -h / 2, d / 2);
gl.Vertex( w / 2, -h / 2, -d / 2);
gl.End();
}
private void drawRiver(float h)
{
//h += 0.1f;
PointF[] pointsXZ =
{
new PointF( 0.1f, 0.5f),
new PointF( 0.05f, 0.2f),
new PointF( 0.0f, 0.0f),
new PointF(-0.2f, -0.5f),
new PointF( 0.0f, -0.5f),
new PointF(-0.2f, -0.3f),
new PointF( 0.25f, 0.0f),
new PointF( 0.3f, 0.5f)
};
gl.Color(0.7f, 0.9f, 1.0f);
gl.Begin(OpenGL.GL_POLYGON);
foreach (PointF p in pointsXZ)
{
gl.Vertex(p.X, h/2, p.Y);
}
gl.End();
gl.Begin(OpenGL.GL_POLYGON);
foreach (PointF p in pointsXZ)
{
gl.Vertex(p.X, -h/2, p.Y);
}
gl.End();
for (int i = 0; i < pointsXZ.Count() - 1; i++)
{
gl.Begin(OpenGL.GL_QUADS);
gl.Vertex(pointsXZ[i].X, h / 2, pointsXZ[i].Y);
gl.Vertex(pointsXZ[i].X, -h / 2, pointsXZ[i].Y);
gl.Vertex(pointsXZ[i + 1].X, -h / 2, pointsXZ[i + 1].Y);
gl.Vertex(pointsXZ[i + 1].X, h / 2, pointsXZ[i + 1].Y);
gl.End();
}
gl.Begin(OpenGL.GL_QUADS);
gl.Vertex(pointsXZ[0].X, h / 2, pointsXZ[0].Y);
gl.Vertex(pointsXZ[0].X, -h / 2, pointsXZ[0].Y);
gl.Vertex(pointsXZ[pointsXZ.Count() - 1].X, -h / 2, pointsXZ[pointsXZ.Count() - 1].Y);
gl.Vertex(pointsXZ[pointsXZ.Count() - 1].X, h / 2, pointsXZ[pointsXZ.Count() - 1].Y);
gl.End();
}
Здесь я пытаюсь разметисть реку в блоке:
private void drawSnowyGround()
{
float height = 0.5f;
//попытка №1:
//gl.Enable(OpenGL.GL_STENCIL_TEST);
//gl.StencilFunc(OpenGL.GL_ALWAYS, 1, 0xFF);
//gl.StencilOp(OpenGL.GL_KEEP, OpenGL.GL_KEEP, OpenGL.GL_REPLACE);
//gl.Color(1f, 1f, 1f);
//drawPar(1f, height, 1f);
//gl.StencilFunc(OpenGL.GL_EQUAL, 1, 0xFF);
//gl.StencilOp(OpenGL.GL_KEEP, OpenGL.GL_KEEP, OpenGL.GL_KEEP);
//gl.Enable(OpenGL.GL_DEPTH_TEST);
//drawRiver(height);
// попытка №9380:
gl.Enable(OpenGL.GL_STENCIL_TEST);
gl.Clear(OpenGL.GL_STENCIL_BUFFER_BIT);
gl.StencilFunc(OpenGL.GL_ALWAYS, 1, 0xFF);
gl.StencilOp(OpenGL.GL_REPLACE, OpenGL.GL_REPLACE, OpenGL.GL_REPLACE);
drawRiver(height);
gl.StencilFunc(OpenGL.GL_NOTEQUAL, 1, 0xFF);
gl.StencilOp(OpenGL.GL_KEEP, OpenGL.GL_KEEP, OpenGL.GL_KEEP);
gl.Color(1f, 1f, 1f);
drawPar(1f, height, 1f);
gl.Disable(OpenGL.GL_STENCIL_TEST);
}
Результат попытки №1:
Полученная фигура лагает потому что грани фигуры лежат на грянях куба
Результат попытки №9380:
Фигура просвечивается с любой стороны куба