Я хочу сделать текст в LWJGL, используя современный OpenGL (рендеринг с VBO и шейдером), но я не знаю, как это сделать.Как визуализировать текст в современном OpenGL с помощью GLSL
ответ
Вот подход:
- Создайте текстуру, содержащую все символы, растеризованы определенного размера.
- Для каждого символа, сохранить расположение пластыря текстуры, содержащей символ
class CharCoords {
public int x, y, width, height;
}
- Загрузить на GPU 2D-квадрат геометрия с вершинами
(0,0), (0,1), (1,0), (1,1)
- Вершинный шейдер может выглядеть следующим образом:
#version 120
uniform mat4 PVMmat; // The projection-view-model matrix
uniform vec4 charCoords; // The CharCoord struct for the character you are rendering, {x, y, w, h}
uniform float texSize; // The size of the texture which contains the rasterized characters (assuming it is square)
uniform vec2 offset; // The offset at which to paint, w.r.t the first character
attribute vec2 vertex;
varying vec2 tc;
void main(){
// Transform from absolute texture coordinates to normalized texture coordinates
// This works because the rectangle spans [0,1] x [0,1]
// Depending on where the origin lies in your texture (i.e. topleft or bottom left corner), you need to replace "1. - vertex.y" with just "vertex.y"
tc = (charCoords.xy + charCoords.zw * vec2(vertex.x, 1. - vertex.y))/texSize;
// Map the vertices of the unit square to a rectangle with correct aspect ratio and positioned at the correct offset
float x = (charCoords[2] * vertex.x + offset.x)/charCoords[3];
float y = vertex.y + offset.y/charCoords[3];
// Apply the model, view and projection transformations
gl_Position = PVMmat * vec4(x, y, 0., 1.);
}
- фрагмент шейдера тривиальна:
#version 120
uniform vec4 color;
uniform sampler2D tex;
varying vec2 tc;
void main() {
gl_FragColor = color * texture2D(tex, tc);
}
- Ваша функция рисования может выглядеть следующим образом (примечание: с ода использует класс шейдера с некоторыми удобными методами, но идея должна быть ясна):
public void drawString(Matrix4f PVMmat, String text, Color color, HAlign halign, VAlign valign) {
Vector2f offset = new Vector2f();
// Font alignment
if(halign == HAlign.Center){
offset.x = -(int) (0.5f * getWidth(text));
}else if(halign == HAlign.Right){
offset.x = -getWidth(text);
}
if(valign == VAlign.Middle){
offset.y = -(int) (0.5f * getHeight());
}else if(valign == VAlign.Top){
offset.y = -getHeight();
}
m_shader.bind();
m_shader.setAttributeBuffer("vertex", m_vertexBuffer, 2);
m_shader.setUniformMatrix("PVMmat", PVMmat);
m_shader.setUniformVector("color", color);
m_shader.setUniformScalar("texSize", (float)m_textureSize);
m_shader.setTexture("tex", m_fontTexture, GL11.GL_TEXTURE_2D);
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, m_model.getIndexBuffer());
for(int i = 0; i < text.length(); ++i) {
CharCoords coo = m_charMap.get(text.charAt(i));
m_shader.setUniformVector("charCoords", new Vector4f(coo.x, coo.y, coo.width, coo.height));
m_shader.setUniformVector("offset", offset);
GL11.glDrawElements(GL11.GL_TRIANGLES, m_indexCount, GL11.GL_UNSIGNED_INT, 0);
offset.x += coo.width;
}
GL15.glBindBuffer(GL15.GL_ELEMENT_ARRAY_BUFFER, 0);
m_shader.unbind();
}
где функции getHeigth
и getWidth
являются:
public int getWidth(String text) {
int totalwidth = 0;
for (int i = 0; i < text.length(); i++) {
CharCoords coo = m_charMap.get(text.charAt(i));
totalwidth += coo.width;
}
return totalwidth;
}
public int getHeight() {
return m_fontMetrics.getHeight();
}
- Примечание: чтобы установить масштаб и положение текста, соответствующим образом измените матрицу модели.
Но Я думаю, что это будет очень медленно, потому что я должен дважды менять форму для каждого персонажа. –
Имейте в виду, что метод конструирования контуров с фиксированной функцией посылает координаты вершины и текстуры в графический процессор для каждого персонажа, который вы рисуете, поэтому он определенно быстрее, чем этот подход. Но я предлагаю попробовать и посмотреть, достаточна ли производительность, иначе оптимизируйте по мере необходимости. Здесь он работает достаточно хорошо. – smani
- 1. Opengl GLSL визуализировать текстуру
- 2. iPhone OpenGl визуализировать текст
- 3. Что такое половина вектора в современном GLSL?
- 4. Перьевое освещение в современном GLSL?
- 5. Как сделать трассировку лучей в современном OpenGL?
- 6. LWJGL/OpenGL/JAVA Как визуализировать текст с помощью FreeType?
- 7. Как визуализировать 3D-текст в OpenGL?
- 8. Как визуализировать текст с помощью QOpenGLWidget
- 9. Как преобразовать направленный свет в координаты экрана в современном GLSL?
- 10. Как визуализировать изображение с помощью OpenGL ES?
- 11. Как настроить стереоскопическое рендеринг в современном OpenGL?
- 12. Как нарисовать цилиндр в современном opengl
- 13. Оптимальная матричная структура и связь CPU/GPU в современном OpenGL с glsl
- 14. C++ Opengl - Как загрузить tgas и png в современном OpenGL?
- 15. Линейные маршруты OpenGL/GLSL
- 16. Как визуализировать объекты и боковые панели с помощью opengl?
- 17. Интерполяция OpenGL GLSL
- 18. рендеринг точек в openGL и GLSL
- 19. gl_LightSource [0] .position.xyz в современном OpenGL
- 20. Как визуализировать текст на квадрат (4 вершины) в OpenGL?
- 21. Как визуализировать данные объема в 3D-текстуру с помощью OpenGL?
- 22. Создание треугольника с OpenGL & GLSL
- 23. Qt 4.6 OpenGL GLSL
- 24. OpenGL GLSL версии шейдеров
- 25. OpenGL shading glitch glsl
- 26. Провести большие круговые точки в современном OpenGL
- 27. OpenGL/GLSL Fog Applications
- 28. Как заполнить буфер глубины вручную с помощью OpenGL и GLSL
- 29. Как визуализировать арабский символ в OpenGL?
- 30. Фрактальное дерево в современном OpenGL (OpenGL 3.3 и выше)
Возможный дубликат [Как нарисовать текст, используя только OpenGL методы?] (Http://stackoverflow.com/questions/8847899/how-to-draw-text-using-only-opengl-methods) –