Математические вычисления, выполняемые на процессоре, дают разные результаты на графическом процессореC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Математические вычисления, выполняемые на процессоре, дают разные результаты на графическом процессоре

Сообщение Anonymous »

Я пытаюсь заставить шейдер фрагментов GLSL искажать входящие фрагменты на основе их текстурных координат, чтобы плохо имитировать CRT.
После того, как код не заработал, я перенес его на C++, чтобы изменить значения RGB текстуры. Код работал так, как ожидалось.
Это наводит меня на мысль, что с моим GLSL-кодом что-то не так, хотя он отражен на C++ и работает отлично.
Есть ли что-то, чего я не знаю о математике GLSL, что может быть причиной этого?
Код C++

Код: Выделить всё

const unsigned int RED = 0xFFFF0000;
const unsigned int BLUE = 0xFF0000FF;
const float X_MAX = 429.0f/448.0f;
const float Y_MAX = 320.0f/336.0f;
const float X_CORNER = 410.0f/448.0f;
const float Y_CORNER = 306.0f/336.0f;
const float X_COEF = (X_MAX-X_CORNER) / (Y_CORNER * Y_CORNER);
const float Y_COEF = (Y_MAX-Y_CORNER) / (X_CORNER * X_CORNER);
float FUNCX(float y)
{
return X_MAX-X_COEF*y*y;
}
float FUNCY(float x)
{
return Y_MAX-Y_COEF*x*x;
}

unsigned int get(glm::vec2 intex)
{
intex *= 2.0;       // Transform the texture rectangle from 0..1
intex.x -= 1.0;     //                  to
intex.y -= 1.0;     //              -1 .. 1
glm::vec2 d = glm::vec2(0.0,0.0);
d.x = FUNCX(intex.y); // get the curve amount for X values based on Y input
d.y = FUNCY(intex.x); // get the curve amount for Y values based on X input
if (abs(intex.x/d.x) > 1.0) // if the X value is outside of the curve
return RED;             // draw RED for debugging
if (abs(intex.y/d.y) > 1.0) // if the Y value is outside of the curve
return BLUE;            // draw BLUE for debugging
glm::vec2 outtex = glm::vec2(0.0f,0.0f);
outtex.x = 1.0 + intex.x/d.x; // Now the -1 .. 1 values get shifted back
outtex.y = 1.0 + intex.y/d.y; //                to
outtex /= 2.0;                //               0 .. 1
return texture.get(512*outtex.x,512*outtex.y);
}
Фрагментный шейдер GLSL:

Код: Выделить всё

const vec4 RED = vec4(1.0,0.0,0.0,1.0);
const vec4 BLUE = vec4(0.0,0.0,1.0,1.0);
const float X_MAX = 429.0/448.0;
const float Y_MAX = 320.0/336.0;
const float X_CORNER = 410.0/448.0;
const float Y_CORNER = 306.0/336.0;
const float X_COEF = (X_MAX-X_CORNER) / (Y_CORNER * Y_CORNER);
const float Y_COEF = (Y_MAX-Y_CORNER) / (X_CORNER * X_CORNER);
float FUNCX(float y)
{
return X_MAX-X_COEF*y*y;
}
float FUNCY(float x)
{
return Y_MAX-Y_COEF*x*x;
}

vec4 get(vec2 intex)
{
intex *= 2.0;       // Transform the texture rectangle from 0..1
intex.x -= 1.0;     //                  to
intex.y -= 1.0;     //              -1 .. 1
vec2 d = vec2(0.0,0.0);
d.x = FUNCX(intex.y); // get the curve amount for X values based on Y input
d.y = FUNCY(intex.x); // get the curve amount for Y values based on X input
if (abs(intex.x/d.x) > 1.0) // if the X value is outside of the curve
return RED;             // draw RED for debugging
if (abs(intex.y/d.y) > 1.0) // if the Y value is outside of the curve
return BLUE;            // draw BLUE for debugging
vec2 outtex = vec2(0.0,0.0);
outtex.x = 1.0 + intex.x/d.x; // Now the -1 .. 1 values get shifted back
outtex.y = 1.0 + intex.y/d.y; //                to
outtex /= 2.0;                //               0 .. 1
return texture2D(texture,outtex);
}
Примечание. Изображение Super Mario World предназначено только для целей тестирования.
Примечание 2. Значения 512 в коде C++ представляют собой размер используемой текстуры.
Изменить: в коде GLSL была опечатка, из-за которой значение y делилось на x вместо y. Это было исправлено, и новые выходные данные остались прежними, поскольку значения знаменателя очень близки.

Подробнее здесь: https://stackoverflow.com/questions/267 ... ult-on-gpu
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»