Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / OpenGL кажется сошел с ума (и рисует сиськи)

OpenGL кажется сошел с ума (и рисует сиськи)

Advanced: Тема повышенной сложности или важная.
Страницы: 1 2 Следующая »
MrShoorУчастникwww12 сен. 201819:21#0
Сиськи были только для привлечения внимания.
А вот сошел он с ума по настоящему. Итак рисую квадрат, на нем должна быть текстура, но её нет, и квадрат черный:
quad | OpenGL кажется сошел с ума (и рисует сиськи)
Рисуется оно таким шейдером:
#version 330 
uniform sampler2D uAtlasMap; 
vec4 Input1; 
 in  vec2 TEXCOORD0; 
layout(location = 0) out  vec4 SV_Target0; 
#define Output0 SV_Target0 
vec4 Temp[1]; 
ivec4 Temp_int[1]; 
uvec4 Temp_uint[1]; 
void main() 
{ 
    Input1.xy = TEXCOORD0.xy; 
    Temp[0] = textureLod(uAtlasMap, Input1.xy, intBitsToFloat(0x0)); 
    Output0.xy = Temp[0].xy; 
    Output0.zw = vec2(intBitsToFloat(0x0), intBitsToFloat(0x3F800000)); 
    return; 
}
Первые мои выводы были такими. Либо uAtlasMap неправильный, либо TEXCOORD0 кривой.

Сначала я проверил TEXCOORD0 заменив на вот такой шейдер:

#version 330 
vec4 Input1; 
 in  vec2 TEXCOORD0; 
layout(location = 0) out  vec4 SV_Target0; 
#define Output0 SV_Target0 
void main() 
{ 
    Input1.xy = TEXCOORD0.xy; 
    Output0.xy = Input1.xy; 
    Output0.zw = vec2(intBitsToFloat(0x0), intBitsToFloat(0x3F800000)); 
    return; 
}
И получил ожидамый градиент:
quad_grad | OpenGL кажется сошел с ума (и рисует сиськи)

Потом полез смотреть в CodeXL, что же там с текстурой, и установкой текстуры:
codexl_scr | OpenGL кажется сошел с ума (и рисует сиськи)
По CodeXL это RG текстура, не пустая, устанавливается на нулевой слот, после чего через glUniform1i передается 0 на четвертую юниформу. Юниформа в шейдере четрветая:
uniform | OpenGL кажется сошел с ума (и рисует сиськи)
То есть вроде все правильно.
Но текстура не рисуется.
Почему? Что могло еще повлиять на отрисовку текстуры?

ZiltopПостоялецwww12 сен. 201819:35#1
Зачем так обманывать ?!
Я их не вижу !
BingoBongoПостоялецwww12 сен. 201819:38#2
Ziltop
> Я их не вижу !
Изображение
ZiltopПостоялецwww12 сен. 201819:39#3
Ну пусть Шурик тогда свои покажет :)
BingoBongoПостоялецwww12 сен. 201819:43#4
Мб не стоило писать intBitsToFloat(0x0)? Напиши просто 0.0f. intBitsToFloat, по-моему, делает побитовое копирование, а не преобразование типов.

Правка: 12 сен. 2018 19:43

Андрей5000Постоялецwww12 сен. 201819:46#5
Ну еще например текстура не pot и неподдерживаемая фильтрация (это если ты под мобилы пишешь). Либо же мипы до конца не залиты. А эта полоска это так и задумано было?

Правка: 12 сен. 2018 19:48

MrShoorУчастникwww12 сен. 201819:50#6
BingoBongo
> Мб не стоило писать intBitsToFloat(0x0)? Напиши просто 0.0f. intBitsToFloat,
> по-моему, делает побитовое копирование, а не преобразование типов.
Это не я писал, а транслятор. Впринципе я могу это поменять руками. Но я уверен, что это не поможет (но сейчас проверю конечно).

Андрей5000
> Ну еще например текстура не pot и неподдерживаемая фильтрация.
Текстура 256*256. Это на скрине выше видно. Мипов нет, но я ведь выбираю нулевой мип: Temp[0] = textureLod(uAtlasMap, Input1.xy, intBitsToFloat(0x0));

MrShoorУчастникwww12 сен. 201819:56#7
Андрей5000
> А эта полоска это так и задумано было?
Ах, да. Полоска - так и задумано, это уже другая геометрия поверх рисуется.
MrShoorУчастникwww12 сен. 201819:58#8
BingoBongo
Заменил шейдер на:
#version 330 
uniform sampler2D uAtlasMap; 
vec4 Input1; 
 in  vec2 TEXCOORD0; 
layout(location = 0) out  vec4 SV_Target0; 
#define Output0 SV_Target0 
vec4 Temp[1]; 
ivec4 Temp_int[1]; 
uvec4 Temp_uint[1]; 
void main() 
{ 
    Input1.xy = TEXCOORD0.xy; 
    Temp[0] = textureLod(uAtlasMap, Input1.xy, 0.0); 
    Output0.xy = Temp[0].xy; 
    Output0.zw = vec2(0.0, 1.0); 
    return; 
} 
Ничего не изменилось. Все так же рисуется:
+ Показать
Iron ManПостоялецwww12 сен. 201820:21#9
MrShoor
> Ничего не изменилось. Все так же рисуется:
Точнее сиськи всё так же не рисуются :) так может проще готовую текстуру с голой бабой воткнуть и не париться? )))
kasПостоялецwww12 сен. 201820:28#10
вроде когда трилинейка и не полный мипчейн надо указывать максимальный мип явно для текстуры
MrShoorУчастникwww12 сен. 201820:43#11
kas
> вроде когда трилинейка и не полный мипчейн надо указывать максимальный мип явно для текстуры
А вот это уже сработало, спасибо! Ни ворнинга тебе, ничего, тишина, несколько часов убил на эту проблему.

Правка: 12 сен. 2018 20:43

BingoBongoПостоялецwww12 сен. 201820:44#12
MrShoor
> Ничего не изменилось. Все так же рисуется:
Значит проблема не в шейдере, а в вызовах OpenGL API.
/A\Постоялецwww12 сен. 201820:47#13
MrShoor
> А вот это уже сработало, спасибо! Ни ворнинга тебе, ничего, тишина.
а откуда огл знает что вон те черные мип уровни содержат не то что тебе надо?
MrShoorУчастникwww12 сен. 201820:53#14
/A\
> а откуда огл знает что вон те черные мип уровни содержат не то что тебе надо?
1. Текстура не содежит мипов. OpenGL это знает, потому что я создавал всего один нулевой мип (это видно на скриншоте выше).
2. Я явно в шейдере говорю "дай мне нулевой мип": Temp[0] = textureLod(uAtlasMap, Input1.xy, 0.0);

Правка: 12 сен. 2018 20:53

Страницы: 1 2 Следующая »

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр