es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

OpenGL: glColor3f() y glVertex3f() con shader

¿Puedo usar glColor3f(), glVertex3f() u otras funciones API con los shaders? Escribí un shader para dibujar un cubo colorido y funciona bien.
Mis shaders de vértices y fragmentos se ven así:

<h1>Shader de vértices</h1>

<h1>versión 330 core</h1>

layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
uniform mat4 model;
uniform mat4 view;
uniform mat4 proj;
out vec4 vertexColor;
void main()
{
    gl_Position = proj * view * model * vec4(aPos.x, aPos.y, aPos.z, 1.0);
    vertexColor = vec4(aColor, 1.0);
};

<h1>Shader de fragmentos</h1>

<h1>versión 330 core</h1>

in vec4 vertexColor;
out vec4 FragColor;
void main(){
    FragColor = vertexColor;
};

Ahora, intento usar las funciones gl junto con mi cubo colorido. Digamos que tengo un código de dibujo como este:

c++
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0, 0, -1, 0, 0, 0, 0, 1, 0);
glColor3f(1.0, 0.0, 0.0);
glLineWidth(3);
glBegin(GL_LINES);
glVertex3f(-1, -1, 0);
glVertex3f(1, 1, 0);

Dado que utilicé glUseProgram() para usar mi propio shader, las funciones gl anteriores no parecen funcionar como se espera (las coordenadas y el color están equivocados). ¿Cómo pasa la función glVertex3f() el vértice al shader? ¿Y cómo deberían verse los shaders cuando se usan las funciones gl para dibujar?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    No, no puedes usar las funciones de API como glColor3f() o glVertex3f() con shaders. Estas funciones modifican directamente la máquina de estado de OpenGL, mientras que los shaders son una forma completamente diferente de renderizar objetos. Los shaders operan en una base por vértice o por píxel, mientras que las funciones de API operan en todo el estado del contexto de OpenGL.

    Cuando usas un shader, le proporcionas los vértices y otra información necesaria para renderizar el objeto. En el caso de tu cubo colorido, estás pasando la posición y la información de color como atributos al vertex shader a través de las variables “aPos” y “aColor”.

    Para usar tu propio shader y seguir utilizando las funciones de API de OpenGL, puedes crear un pipeline de renderizado separado. Este pipeline utilizará tu shader para renderizar el cubo colorido y luego cambiará al pipeline predeterminado para renderizar los demás objetos utilizando las funciones de API.

    Para pasar los vértices a los shaders, típicamente se utilizan Vertex Buffer Objects (VBOs) o Vertex Array Objects (VAOs). Estos objetos almacenan los datos de los vértices en memoria y los proporcionan al shader al renderizar. También puedes usar variables Uniform para pasar valores que sean compartidos entre múltiples vértices. Estos valores se establecen antes de renderizar y están disponibles para todos los shaders en el pipeline.

    En resumen, al utilizar shaders, debes evitar usar funciones de API como glColor3f() o glVertex3f(). En su lugar, utiliza VBOs, VAOs y Uniforms para pasar los datos a los shaders para el renderizado. Si deseas utilizar una combinación de shaders y funciones de API, crea pipelines de renderizado separados para cada uno.

Comments are closed.