Я делаю лучевое кастинг в шейдере фрагментов. Я могу придумать пару способов сделать полноэкранный четырехъядерный квадрат для этой цели. Либо нарисуйте квадрат в пространстве клипа с матрицей проекции, установленной на единицу матрицы, или используйте геометрический шейдер, чтобы превратить точку в треугольную полосу. Первый использует немедленный режим, устаревший в OpenGL 3.2. Последнее я использую из новизны, но оно все еще использует немедленный режим для рисования точки.
Каков наилучший способ рисовать полноэкранный четырехъядерный процессор в OpenGL 3.2?
Ответ 1
Вы можете отправить два треугольника, создающих квад, причем их атрибуты вершин равны -1/1 соответственно.
Вам не нужно умножать их на любую матрицу в шейдере вершин/фрагментов.
Вот некоторые примеры кода, простые, как есть:)
Vertex Shader:
const vec2 madd=vec2(0.5,0.5);
attribute vec2 vertexIn;
varying vec2 textureCoord;
void main() {
textureCoord = vertexIn.xy*madd+madd; // scale vertex attribute to [0-1] range
gl_Position = vec4(vertexIn.xy,0.0,1.0);
}
Фрагментный шейдер:
varying vec2 textureCoord;
void main() {
vec4 color1 = texture2D(t,textureCoord);
gl_FragColor = color1;
}
Ответ 2
Для вывода полноэкранного четырехмерного геометрического шейдера можно использовать:
#version 330 core
layout(points) in;
layout(triangle_strip, max_vertices = 4) out;
out vec2 texcoord;
void main()
{
gl_Position = vec4( 1.0, 1.0, 0.5, 1.0 );
texcoord = vec2( 1.0, 1.0 );
EmitVertex();
gl_Position = vec4(-1.0, 1.0, 0.5, 1.0 );
texcoord = vec2( 0.0, 1.0 );
EmitVertex();
gl_Position = vec4( 1.0,-1.0, 0.5, 1.0 );
texcoord = vec2( 1.0, 0.0 );
EmitVertex();
gl_Position = vec4(-1.0,-1.0, 0.5, 1.0 );
texcoord = vec2( 0.0, 0.0 );
EmitVertex();
EndPrimitive();
}
Вершинный шейдер просто пуст:
#version 330 core
void main()
{
}
Чтобы использовать этот шейдер, вы можете использовать команду dummy draw с пустым VBO:
glDrawArrays(GL_POINTS, 0, 1);
Ответ 3
Подсказка Чистофа Риччио:
Большой треугольник более эффективен по причине, которую я проиллюстрировал в видео:
Ответ 4
Ниже приведена функция рисования класса, которая рисует текстуры fbo на выровненный квадрат.
Gl.glUseProgram(shad);
Gl.glBindBuffer(Gl.GL_ARRAY_BUFFER, vbo);
Gl.glEnableVertexAttribArray(0);
Gl.glEnableVertexAttribArray(1);
Gl.glVertexAttribPointer(0, 3, Gl.GL_FLOAT, Gl.GL_FALSE, 0, voff);
Gl.glVertexAttribPointer(1, 2, Gl.GL_FLOAT, Gl.GL_FALSE, 0, coff);
Gl.glActiveTexture(Gl.GL_TEXTURE0);
Gl.glBindTexture(Gl.GL_TEXTURE_2D, fboc);
Gl.glUniform1i(tileLoc, 0);
Gl.glDrawArrays(Gl.GL_QUADS, 0, 4);
Gl.glBindTexture(Gl.GL_TEXTURE_2D, 0);
Gl.glBindBuffer(Gl.GL_ARRAY_BUFFER, 0);
Gl.glUseProgram(0);
Фактический квад и координаты получаются из:
private float[] v=new float[]{ -1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
1.0f, 1.0f, 0.0f,
-1.0f, 1.0f, 0.0f,
0.0f, 0.0f,
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 1.0f
};
Связывание и настройка vbo я оставляю вам.
Вершинный шейдер:
#version 330
layout(location = 0) in vec3 pos;
layout(location = 1) in vec2 coord;
out vec2 coords;
void main() {
coords=coord.st;
gl_Position=vec4(pos, 1.0);
}
Поскольку позиция является исходной, т.е. не умножается на какую-либо матрицу, -1, -1:: 1, 1 квадрата вставляется в окно просмотра. Ищите учебник Alfonse, связанный с любыми его сообщениями на openGL.org.