|
17.06.2014, 23:28
|
#121
|
Мастер
Регистрация: 12.01.2009
Сообщений: 980
Написано 389 полезных сообщений (для 632 пользователей)
|
Ответ: OpenGL
Я решил что мне пора за opengl основательно взяться.
Так вот сегодня начал разбираться и непонятна такая вещь:
допустим мне надо определённый ректангл закрасить цветом с помощью glClear. В доках написано что можно юзать glScissor.
Ок я сделал так:
glEnable( GL_SCISSOR_TEST );
glScissor( 100, 100, 50, 50 );
glClear( GL_COLOR_BUFFER_BIT );
glDisable( GL_SCISSOR_TEST );
Но закрашивается весь экран целиком.
Видимо я что то упустил.
|
(Offline)
|
|
17.06.2014, 23:57
|
#122
|
Терабайт исходников
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений (для 6,051 пользователей)
|
Ответ: OpenGL
не знаю точно насчёт GL, но вот из dx10-11 убрали фичу клеара ректанглов (в 9 была) по каким-то причинам что типа железо так не умеет нормально делать все равно. советуют рисовать квад с цветом очищения)
т.к. проблема вроде завязана на хардваре, то и в gl возможно то же.
---
бррр... похоже это было только в 10, в 11 снова можно клеарить ректанглы.
---
а, нет, в 11 тоже нельзя, но можно в 11.1
---
могу точно сказать что в юнити на дх11 клеар делается рисованием квадов
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
18.06.2014, 00:05
|
#123
|
Мастер
Регистрация: 12.01.2009
Сообщений: 980
Написано 389 полезных сообщений (для 632 пользователей)
|
Ответ: OpenGL
OpenGL очень запутанная вещь!
Собственно да, поэтому и спрашиваю, в d3d9 можно не просто рект закрасить, но и передать массив ректов за один вызов Clear.
|
(Offline)
|
|
18.06.2014, 00:18
|
#124
|
Мастер
Регистрация: 12.01.2009
Сообщений: 980
Написано 389 полезных сообщений (для 632 пользователей)
|
Ответ: OpenGL
Да походу дела на glClear скиссор не влияет, потому что квад обрезается скиссором, а заполнение цвета - нет.
|
(Offline)
|
|
18.06.2014, 01:06
|
#125
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: OpenGL
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
18.06.2014, 01:22
|
#126
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: OpenGL
у меня работало.
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо HolyDel за это полезное сообщение:
|
|
18.06.2014, 01:36
|
#127
|
Мастер
Регистрация: 12.01.2009
Сообщений: 980
Написано 389 полезных сообщений (для 632 пользователей)
|
Ответ: OpenGL
Ну что, значит у меня левый opengl =).
Дальше поразбираюсь в нём чтоб хоть как то ориентироваться, тогда может быть попробую поэкспериментировать со скиссором.
|
(Offline)
|
|
18.06.2014, 03:03
|
#128
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: OpenGL
у меня правда это было на мульткамерах.
там помимо scissor-a был еще и glViewport
|
(Offline)
|
|
18.06.2014, 13:47
|
#129
|
Мастер
Регистрация: 12.01.2009
Сообщений: 980
Написано 389 полезных сообщений (для 632 пользователей)
|
Ответ: OpenGL
glViewport точно также - работает для выводимых примитивов, но glClear всё равно закрашивает весь экран.
----
Вот еще вопрос: контекст можно создать например через freeglut или через wgl функции winapi.
В последних больше всяких настроек, но вообще нужно ли такое количество для среднестатистического opengl движка?
И соответственно в Linux чего лучше использовать?
|
(Offline)
|
|
03.10.2016, 18:18
|
#130
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: OpenGL
Как включить АА (антиалиазинг) ??
Рисую квадами, так как нужно задавать толщину линии, а glLineWidth не работает.
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, так как не хотел запариваться . Само рисование:
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, то подскажите как отрисовать кучу Квадов разного цвета передав один массив.
|
(Offline)
|
|
03.10.2016, 19:41
|
#131
|
Бывалый
Регистрация: 06.04.2009
Сообщений: 612
Написано 276 полезных сообщений (для 858 пользователей)
|
Ответ: OpenGL
Если не по доисторическому, то так или иначе надо хоть простейший шейдер таки написать, и передавать в него координаты и цвет. Это не сложно погугли simple opengl shader example и довавь свой uniform.
К слову glLineWidth - устаревшая функция.
|
(Offline)
|
|
03.10.2016, 20:14
|
#132
|
Чудо-кот
Регистрация: 22.02.2011
Сообщений: 901
Написано 480 полезных сообщений (для 1,471 пользователей)
|
Ответ: 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));
}
|
(Offline)
|
|
04.10.2016, 00:48
|
#133
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: OpenGL
Это понятно, как мне линию сгладить?
Anti-Alias е включается.
|
(Offline)
|
|
04.10.2016, 11:03
|
#134
|
Дэвелопер
Регистрация: 14.02.2007
Сообщений: 1,471
Написано 824 полезных сообщений (для 2,920 пользователей)
|
Ответ: OpenGL
Сообщение от RegIon
Это понятно, как мне линию сгладить?
Anti-Alias е включается.
|
Ну таки что-то неправильно делаешь раз не включается. Еще можно текстуру натянуть на квады, но не уверен что получится на тонких линиях.
Что касается VBO - надо юзать glBufferData, glEnableVertexAttribArray и glVertexAttribPointer (но я не уверен что в последних версиях ОГЛ это труъ путь, хотя в любом случае лучше чем сейчас у тебя). А там хоть каждый вертекс рисуй разным цветом.
|
(Offline)
|
|
04.10.2016, 15:07
|
#135
|
Элита
Регистрация: 16.01.2010
Адрес: Новосибирск
Сообщений: 2,158
Написано 502 полезных сообщений (для 1,012 пользователей)
|
Ответ: OpenGL
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
Последний раз редактировалось RegIon, 04.10.2016 в 17:05.
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 05:03.
|