Я хочу сделать шейдер для игры в пиксель, которая бы нарисовала спрайт с контуром, если его цвет фона совпадает с указанным цветом. Эта версия работает нормально (1-е фото): < /p>
#version 400 core
in vec2 TexCoords;
out vec4 color;
uniform sampler2D backi;
uniform sampler2D image;
void main()
{
vec4 px = texture(image, TexCoords);
if (px.w > 0)
{
color = px;
}
else if (texture(backi, vec2(gl_FragCoord.x / 640.0f, gl_FragCoord.y / 360.0f)).xyz == vec3(33.0f / 255.0f, 30.0f / 255.0f, 32.0f / 255.0f))
{
float sum = textureOffset(image, TexCoords, ivec2(0, 1)).w
+ textureOffset(image, TexCoords, ivec2(0, -1)).w
+ textureOffset(image, TexCoords, ivec2(1, 0)).w
+ textureOffset(image, TexCoords, ivec2(-1, 0)).w;
if (sum > 0)
color = vec4(255, 255, 255, 255);
else
color = vec4(0, 0, 0, 0);
}
else
{
color = vec4(0, 0, 0, 0);
}
}
Я хочу запросить окружающие пиксели с помощью TexturegatherOffsets вместо этого:
else if (texture(backi, vec2(gl_FragCoord.x / 640.0f, gl_FragCoord.y / 360.0f)).xyz == vec3(33.0f / 255.0f, 30.0f / 255.0f, 32.0f / 255.0f))
{
const ivec2 offsets[4] = const ivec2[](
ivec2(0, 1),
ivec2(0, -1),
ivec2(1, 0),
ivec2(-1, 0)
);
vec4 res = textureGatherOffsets(image, TexCoords, offsets, 3);
float sum = res.x + res.y + res.z + res.w;
if (sum > 0)
color = vec4(255, 255, 255, 255);
else
color = vec4(0, 0, 0, 0);
}
< /code>
По какой-то причине эта версия шейдера хорошо работает на одной настройке (RTX 3070), но не на другой (I7-1270p IGPU) (2-е фото). Это также не тот случай, когда набросок на 1 пиксель, я попытался сменить смещения (3 -е фото). Есть ли что -то с неопределенным поведением в моем шейдере, и как я могу это исправить? MIPMAPP. То, как я создаю Framebuffer и текстуру для фона: < /p>
// Framebuffers
glGenFramebuffers(1, &m_renderTarget);
glBindFramebuffer(GL_FRAMEBUFFER, m_renderTarget);
// Generating texture
glGenTextures(1, &m_renderTargetTexture);
glBindTexture(GL_TEXTURE_2D, m_renderTargetTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 640, 360, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_2D, 0);
// Binding texture
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_renderTargetTexture, 0);
// Generating RBO
unsigned int rbo;
glGenRenderbuffers(1, &rbo);
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 640, 360);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
// Binding RBO
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
std::cout
struct Texture
{
unsigned int m_w = 0;
unsigned int m_h = 0;
unsigned int m_id = -1;
};
Texture Renderer::loadTexture(const std::string &path_)
{
auto *imgSurface = IMG_Load(path_.c_str());
if (!imgSurface)
{
std::cout h;
std::cout format->format) pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glBindTexture(GL_TEXTURE_2D, 0);
dumpErrors();
SDL_FreeSurface(imgSurface);
return res;
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... nt-devices
GLSL Шейдер работает по -разному на разных устройствах ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1749127751
Anonymous
Я хочу сделать шейдер для игры в пиксель, которая бы нарисовала спрайт с контуром, если его цвет фона совпадает с указанным цветом. Эта версия работает нормально (1-е фото): < /p>
#version 400 core
in vec2 TexCoords;
out vec4 color;
uniform sampler2D backi;
uniform sampler2D image;
void main()
{
vec4 px = texture(image, TexCoords);
if (px.w > 0)
{
color = px;
}
else if (texture(backi, vec2(gl_FragCoord.x / 640.0f, gl_FragCoord.y / 360.0f)).xyz == vec3(33.0f / 255.0f, 30.0f / 255.0f, 32.0f / 255.0f))
{
float sum = textureOffset(image, TexCoords, ivec2(0, 1)).w
+ textureOffset(image, TexCoords, ivec2(0, -1)).w
+ textureOffset(image, TexCoords, ivec2(1, 0)).w
+ textureOffset(image, TexCoords, ivec2(-1, 0)).w;
if (sum > 0)
color = vec4(255, 255, 255, 255);
else
color = vec4(0, 0, 0, 0);
}
else
{
color = vec4(0, 0, 0, 0);
}
}
Я хочу запросить окружающие пиксели с помощью TexturegatherOffsets вместо этого:
else if (texture(backi, vec2(gl_FragCoord.x / 640.0f, gl_FragCoord.y / 360.0f)).xyz == vec3(33.0f / 255.0f, 30.0f / 255.0f, 32.0f / 255.0f))
{
const ivec2 offsets[4] = const ivec2[](
ivec2(0, 1),
ivec2(0, -1),
ivec2(1, 0),
ivec2(-1, 0)
);
vec4 res = textureGatherOffsets(image, TexCoords, offsets, 3);
float sum = res.x + res.y + res.z + res.w;
if (sum > 0)
color = vec4(255, 255, 255, 255);
else
color = vec4(0, 0, 0, 0);
}
< /code>
По какой-то причине эта версия шейдера хорошо работает на одной настройке (RTX 3070), но не на другой (I7-1270p IGPU) (2-е фото). Это также не тот случай, когда набросок на 1 пиксель, я попытался сменить смещения (3 -е фото). Есть ли что -то с неопределенным поведением в моем шейдере, и как я могу это исправить? MIPMAPP. То, как я создаю Framebuffer и текстуру для фона: < /p>
// Framebuffers
glGenFramebuffers(1, &m_renderTarget);
glBindFramebuffer(GL_FRAMEBUFFER, m_renderTarget);
// Generating texture
glGenTextures(1, &m_renderTargetTexture);
glBindTexture(GL_TEXTURE_2D, m_renderTargetTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 640, 360, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_2D, 0);
// Binding texture
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_renderTargetTexture, 0);
// Generating RBO
unsigned int rbo;
glGenRenderbuffers(1, &rbo);
glBindRenderbuffer(GL_RENDERBUFFER, rbo);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, 640, 360);
glBindRenderbuffer(GL_RENDERBUFFER, 0);
// Binding RBO
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, rbo);
if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
std::cout
struct Texture
{
unsigned int m_w = 0;
unsigned int m_h = 0;
unsigned int m_id = -1;
};
Texture Renderer::loadTexture(const std::string &path_)
{
auto *imgSurface = IMG_Load(path_.c_str());
if (!imgSurface)
{
std::cout h;
std::cout format->format) pixels);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glBindTexture(GL_TEXTURE_2D, 0);
dumpErrors();
SDL_FreeSurface(imgSurface);
return res;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79654026/glsl-shader-works-differently-on-different-devices[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия