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 17.06.2014 23:28

Ответ: OpenGL
 
Я решил что мне пора за opengl основательно взяться.
Так вот сегодня начал разбираться и непонятна такая вещь:
допустим мне надо определённый ректангл закрасить цветом с помощью glClear. В доках написано что можно юзать glScissor.
Ок я сделал так:
Код:

glEnable( GL_SCISSOR_TEST );
glScissor( 100, 100, 50, 50 );
glClear( GL_COLOR_BUFFER_BIT );
glDisable( GL_SCISSOR_TEST );

Но закрашивается весь экран целиком.
Видимо я что то упустил.

Mr_F_ 17.06.2014 23:57

Ответ: OpenGL
 
не знаю точно насчёт GL, но вот из dx10-11 убрали фичу клеара ректанглов (в 9 была) по каким-то причинам что типа железо так не умеет нормально делать все равно. советуют рисовать квад с цветом очищения)
т.к. проблема вроде завязана на хардваре, то и в gl возможно то же.
---
бррр... похоже это было только в 10, в 11 снова можно клеарить ректанглы.
---
а, нет, в 11 тоже нельзя, но можно в 11.1
---
могу точно сказать что в юнити на дх11 клеар делается рисованием квадов

Samodelkin 18.06.2014 00:05

Ответ: OpenGL
 
OpenGL очень запутанная вещь!

Собственно да, поэтому и спрашиваю, в d3d9 можно не просто рект закрасить, но и передать массив ректов за один вызов Clear.

Samodelkin 18.06.2014 00:18

Ответ: OpenGL
 
Да походу дела на glClear скиссор не влияет, потому что квад обрезается скиссором, а заполнение цвета - нет.

moka 18.06.2014 01:06

Ответ: OpenGL
 
А тут пишут что все ок: http://gamedev.stackexchange.com/que...e-of-glscissor

HolyDel 18.06.2014 01:22

Ответ: OpenGL
 
у меня работало.

Samodelkin 18.06.2014 01:36

Ответ: OpenGL
 
Ну что, значит у меня левый opengl =).
Дальше поразбираюсь в нём чтоб хоть как то ориентироваться, тогда может быть попробую поэкспериментировать со скиссором.

HolyDel 18.06.2014 03:03

Ответ: OpenGL
 
у меня правда это было на мульткамерах.
там помимо scissor-a был еще и glViewport

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_ALPHAGL_ONE_MINUS_SRC_ALPHA);
    
glLineWidth(0.5f); 

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

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

void GLRender() {
    if (
_hDC) {

        
glClearColor(bgColor[0] / 256.0fbgColor[1] / 256.0fbgColor[2] / 256.0f0.0f);
        
glClear(GL_COLOR_BUFFER_BIT);
    
        
glLoadIdentity();
        
glOrtho(0_w0_h, -11);
        
        
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 0lineBuffer.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 BYTEbitmapint widthint heightint pixel_size) {
    
glGenTextures(1, &fontTexture);
    
height 2;
    
width 2;
    
BYTE *data = new BYTE[3]{
        
255,0,00,255,0,
        
255,0,00,0,255
    
};

    
glBindTexture(GL_TEXTURE_2DfontTexture);
    
glTexImage2D(GL_TEXTURE_2D0GL_RGBheightwidth0GL_RGBGL_UNSIGNED_BYTEdata);
    
glTexParameteri(GL_TEXTURE_2DGL_TEXTURE_MAG_FILTERGL_NEAREST);
    
glTexParameteri(GL_TEXTURE_2DGL_TEXTURE_MIN_FILTERGL_NEAREST);

    
glActiveTexture(GL_TEXTURE0);


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



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

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


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

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