forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   OpenGL (http://forum.boolean.name/showthread.php?t=356)

Samodelkin 18.06.2014 13:47

Ответ: OpenGL
 
glViewport точно также - работает для выводимых примитивов, но glClear всё равно закрашивает весь экран.
----
Вот еще вопрос: контекст можно создать например через freeglut или через wgl функции winapi.
В последних больше всяких настроек, но вообще нужно ли такое количество для среднестатистического opengl движка?
И соответственно в Linux чего лучше использовать?

RegIon 03.10.2016 18:18

Ответ: OpenGL
 

Как включить АА (антиалиазинг) ??
Рисую квадами, так как нужно задавать толщину линии, а glLineWidth не работает.

PHP код:

glEnable(GL_POLYGON_SMOOTH);
    
glEnable(GL_LINE_SMOOTH);
    
glEnable(GL_BLEND);
    
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    
glLineWidth(0.5f); 

это вообще никак не помогает.
Рисую без шейдеров, так как они для задачи нафиг не нужны, но отрисовать на OpenGL нужно.

И пинайте меня, но я рисую без VBO, так как не хотел запариваться . Само рисование:
PHP код:

void GLRender() {
    if (
_hDC) {

        
glClearColor(bgColor[0] / 256.0f, bgColor[1] / 256.0f, bgColor[2] / 256.0f, 0.0f);
        
glClear(GL_COLOR_BUFFER_BIT);
    
        
glLoadIdentity();
        
glOrtho(0, _w, 0, _h, -1, 1);
        
        
glPushMatrix();
        
        
DrawLines();
    
        
glPopMatrix();

        
SwapBuffers(_hDC);
    }
}

void DrawCustomLine(GLLine line) {

    
glColor3ub(line.color[0], line.color[1], line.color[2]);

    
float nx = line.x2 - line.x1;
    
float ny = line.y2 - line.y1;
    
float len = sqrtf(nx*nx + ny*ny);
    
nx /= len *2;
    
ny /= len *2;

    
//0__1
    //I  I
    //3__2
    
glVertex2f(line.x1 - floor(line.thinkness * ny), line.y1 + ceil(line.thinkness * nx));
    
glVertex2f(line.x1 + ceil(line.thinkness * ny), line.y1 - floor(line.thinkness * nx));
    
    
glVertex2f(line.x2 + ceil(line.thinkness * ny), line.y2 - floor(line.thinkness * nx));
    
glVertex2f(line.x2 - floor(line.thinkness * ny), line.y2 + ceil(line.thinkness * nx));

}

void DrawLines() {

    
glBegin(GL_QUADS);

    for (
size_t i = 0; i < lineBuffer.size(); i++) {

        
DrawCustomLine(lineBuffer[i]); 
    }

    
glEnd();
} 

А если через VBO, то подскажите как отрисовать кучу Квадов разного цвета передав один массив.

Mhyhr 03.10.2016 19:41

Ответ: OpenGL
 
Если не по доисторическому, то так или иначе надо хоть простейший шейдер таки написать, и передавать в него координаты и цвет. Это не сложно погугли simple opengl shader example и довавь свой uniform.

К слову glLineWidth - устаревшая функция.

Nerd 03.10.2016 20:14

Ответ: OpenGL
 
pfffff
Код:

    glColor4ub(line.color[0], line.color[1], line.color[2],64);

    float d = 0.4;
    for(int i=0;i<4;i++){
      float dx = sin(i*1.6)*d;
      float dy = cos(i*1.6)*d;
        glVertex2f(dx+line.x1 - floor(line.thinkness * ny), dy+line.y1 + ceil(line.thinkness * nx));
          glVertex2f(dx+line.x1 + ceil(line.thinkness * ny), dy+line.y1 - floor(line.thinkness * nx));
        glVertex2f(dx+line.x2 + ceil(line.thinkness * ny), dy+line.y2 - floor(line.thinkness * nx));
          glVertex2f(dx+line.x2 - floor(line.thinkness * ny), dy+line.y2 + ceil(line.thinkness * nx));
    }


thickness

RegIon 04.10.2016 00:48

Ответ: OpenGL
 
Это понятно, как мне линию сгладить?
Anti-Alias е включается.

Knightmare 04.10.2016 11:03

Ответ: OpenGL
 
Цитата:

Сообщение от RegIon (Сообщение 308944)
Это понятно, как мне линию сгладить?
Anti-Alias е включается.

Ну таки что-то неправильно делаешь раз не включается. Еще можно текстуру натянуть на квады, но не уверен что получится на тонких линиях.
Что касается VBO - надо юзать glBufferData, glEnableVertexAttribArray и glVertexAttribPointer (но я не уверен что в последних версиях ОГЛ это труъ путь, хотя в любом случае лучше чем сейчас у тебя). А там хоть каждый вертекс рисуй разным цветом.

RegIon 04.10.2016 15:07

Ответ: OpenGL
 
PHP код:

void GLSetFontBitmap(const BYTE* bitmap, int width, int height, int pixel_size) {
    
glGenTextures(1, &fontTexture);
    
height = 2;
    
width = 2;
    
BYTE *data = new BYTE[2 * 2 * 3]{
        
255,0,0, 0,255,0,
        
255,0,0, 0,0,255
    
};

    
glBindTexture(GL_TEXTURE_2D, fontTexture);
    
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, height, width, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
    
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

    
glActiveTexture(GL_TEXTURE0);
} 

Почему вылетает MAV при вызове glActiveTexture()??



Студия 15, GL из под коробки, glew с NuGet

UPD. Собрал отдельный проект чисто на С++, все равно вышибает на том же месте.
Проект:
https://1drv.ms/u/s!AsK_zL9knxgkhiSs321g6ajyy_Ec


Часовой пояс GMT +4, время: 22:48.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Перевод: zCarot