Saltar al contenido

Dibujar círculo con OpenGL

Esta es el arreglo más acertada que te podemos dar, sin embargo obsérvala detenidamente y valora si es compatible a tu proyecto.

Solución:

Parece que inmediatamente después de dibujar el círculo, ingresa al bucle de saturación principal, donde ha establecido el Draw() función para dibujar cada vez a través del bucle. Así que probablemente sea dibujar el círculo, luego borrarlo inmediatamente y dibujar el cuadrado. Probablemente deberías hacer DrawCircle() tu glutDisplayFunc(), o llamar DrawCircle() desde Draw().

#include 
#include 
#include 
#include 
#include 
#include 
#define window_width  1080  
#define window_height 720 
void drawFilledSun() GL_DEPTH_BUFFER_BIT);
    glLoadIdentity();
    glTranslatef(0, 0, -10);
    int i, x, y;
    double radius = 0.30;
    //glColor3ub(253, 184, 19);     
    glColor3ub(255, 0, 0);
    double twicePi = 2.0 * 3.142;
    x = 0, y = 0;
    glBegin(GL_TRIANGLE_FAN); //BEGIN CIRCLE
    glVertex2f(x, y); // center of circle
    for (i = 0; i <= 20; i++)   
        glVertex2f (
            (x + (radius * cos(i * twicePi / 20))), (y + (radius * sin(i * twicePi / 20)))
            );
    
    glEnd(); //END

void DrawCircle(float cx, float cy, float r, int num_segments) 
    glBegin(GL_LINE_LOOP);
    for (int ii = 0; ii < num_segments; ii++)   
        float theta = 2.0f * 3.1415926f * float(ii) / float(num_segments);//get the current angle 
        float x = r * cosf(theta);//calculate the x component 
        float y = r * sinf(theta);//calculate the y component 
        glVertex2f(x + cx, y + cy);//output vertex 
    
    glEnd();

void main_loop_function() 
    int c;
    drawFilledSun();
    DrawCircle(0, 0, 0.7, 100);
    glutSwapBuffers();
    c = getchar();

void GL_Setup(int width, int height) 
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glEnable(GL_DEPTH_TEST);
    gluPerspective(45, (float)width / height, .1, 100);
    glMatrixMode(GL_MODELVIEW);

int main(int argc, char** argv)  GLUT_DOUBLE);
    glutCreateWindow("GLUT Example!!!");
    glutIdleFunc(main_loop_function);
    GL_Setup(window_width, window_height);
    glutMainLoop();

Esto es lo que hice. Espero que esto ayude. Aquí hay dos tipos de círculos. Lleno y sin llenar.

Hay otra forma de dibujar un círculo: dibujarlo en el sombreador de fragmentos. Crea un quad:

float right = 0.5;
float bottom = -0.5;
float left = -0.5;
float top = 0.5;
float quad[20] = 
    //x, y, z, lx, ly
    right, bottom, 0, 1.0, -1.0,
    right, top, 0, 1.0, 1.0,
    left, top, 0, -1.0, 1.0,
    left, bottom, 0, -1.0, -1.0,
;

Enlazar VBO:

unsigned int glBuffer;
glGenBuffers(1, &glBuffer);
glBindBuffer(GL_ARRAY_BUFFER, glBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*20, quad, GL_STATIC_DRAW);

y dibuja:

#define BUFFER_OFFSET(i) ((char *)NULL + (i))
glEnableVertexAttribArray(ATTRIB_VERTEX);
glEnableVertexAttribArray(ATTRIB_VALUE);
glVertexAttribPointer(ATTRIB_VERTEX , 3, GL_FLOAT, GL_FALSE, 20, 0);
glVertexAttribPointer(ATTRIB_VALUE , 2, GL_FLOAT, GL_FALSE, 20, BUFFER_OFFSET(12));
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);

Sombreador de vértices

attribute vec2 value;
uniform mat4 viewMatrix;
uniform mat4 projectionMatrix;
varying vec2 val;
void main() 
    val = value;
    gl_Position = projectionMatrix*viewMatrix*vertex;

Sombreador de fragmentos

varying vec2 val;
void main()  dist <= R2) 
        discard;
    
    float sm = smoothstep(R,R-0.01,dist);
    float sm2 = smoothstep(R2,R2+0.01,dist);
    float alpha = sm*sm2;
    gl_FragColor = vec4(0.0, 0.0, 1.0, alpha);

No olvide habilitar la combinación alfa:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

ACTUALIZAR: Leer más

Valoraciones y comentarios

Si conservas algún recelo o capacidad de perfeccionar nuestro sección eres capaz de dejar una nota y con mucho placer lo interpretaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *