Каркасы в OpenGL - PullRequest
       2

Каркасы в OpenGL

3 голосов
/ 17 февраля 2011

glPolygoneMode(GL_FRONT_AND_BACK, GL_FILL) включен, и как я могу получить каркас в этой ситуации? Есть ли способ получить каркасный рендеринг без переключения Polygone Mode на GL_LINE?

Ответы [ 3 ]

18 голосов
/ 17 февраля 2011
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );

Заполните, заполняете ... хотите строки.

EDIT: Помните, что вы всегда можете положить его обратно, чтобы заполнить, когда вы закончите, как это

glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
 // add polygons here
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
3 голосов
/ 17 февраля 2011

Исходя из вашего вопроса, я предполагаю, что у вас есть какое-то огромное промежуточное ПО, и у вас есть доступ только к шейдерам, я прав?

В этом случае создайте в своем вершинном шейдере переменную, называемую, например, vertexID:

varying float vertexID; # in GLSL <= 3, or
out float vertexID;     # in GLSL 4

и присвойте ему встроенный gl_VertexID:

vertexID = (float)gl_VertexID;

Таким образом, вы получите доступ к gl_VertexID из фрагментного шейдера, но с интерполяцией! Это здорово, потому что это будет, например, 2 в одной вершине, 3 в соседнем и 2.5 в промежутке.

Так что вам просто нужно проверить, близок ли vertexID к 2 (соответственно, 3): если это так, вы близки к краю. Этого должно быть достаточно для визуализации и отладки.

in float vertexID; # or
varying float vertexID;

// blabla

if (fract(vertexID) < 0.1){
    outcolor = vec4(1,0,0,0); # in glsl 4
}

Обратите внимание, что таким образом вы получите только 2 ребра каждого треугольника. И, возможно, некоторые из них будут очень тонкими (если один vertexID равен 2, а другой 1000, зона 0.1 мало).

2 голосов
/ 17 февраля 2011

Ваш вопрос не ясен, но я предполагаю, что вы хотите визуализировать как заполненный многоугольник, так и каркас. Оказывается, это не так тривиально. Классический способ решения проблемы:

glPolygonMode( ... GL_FILL);
draw();
glPolygonOffset( param1, param2 );
glPolygonMode( ... GL_LINE );
draw();

но это не без проблем, таких как вычисление значений для передачи glPolygonOffset и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...