Сбой драйвера шейдера фрагмента OpenGL Jogl GL4 - PullRequest
0 голосов
/ 22 сентября 2019

это мой фрагментный шейдер для рендера трассировки лучей.Я реализовал порт алгоритма рисования линий bresenhams для проверки на предмет попадания.

Проблема в том, что мой драйвер видеокарты упал при запуске.

Несколько вещей, которые я пробовал:

  • Оставьте доступ к массиву, чтобы убедиться, что он не имеет ничего общего с исключением индекса и т. Д.
  • Используйте фиктивный код с интенсивным вычислением для цикла, чтобы проверить, нужно ли это делатьс недостаточной производительностью.
  • понижение с последних версий драйверов nvidia до 3 разных версий.
  • Напишите цикл while, который не завершается.(Рендеринг все еще обновляется, поэтому я предполагаю, что компилятор opengl обнаруживает подобные вещи?)

Я не вижу никаких очевидных ошибок, поэтому мне интересно, почему происходит сбой.

здесьфрагментный шейдер.Метод bresenham (), кажется, вызывает сбой.

#version 430

layout(std430, binding = 3) buffer target
{
    int data[];
};

out vec4 fragColor;
in vec4 gl_FragCoord;

uniform vec3 lightPos;
uniform vec3 cameraPos;


vec3 lightColor = vec3(2,2,1.5);
vec3 ambientLight = vec3(0.1,0.1,0.1);
vec3 targetColor = vec3(0.1,0.1,0.1);

float rad = 5;


int getIndex(vec3 pos){

    int x = int(mod(pos.x,7));
    int y = int(mod(pos.y,7));
    int z = int(mod(pos.z,7));

    return 2;
}


bool bresenham(vec3 origin, vec3 dir){



    int xs;
    int ys;
    int zs;

    float dx = abs(dir.x - origin.x);
    float dy = abs(dir.y - origin.y);
    float dz = abs(dir.z - origin.z);

    if (dir.x > origin.x){
        xs = 1;
    }else{
        xs = -1;
    }
    if (dir.y > origin.y){
        ys = 1;
    }else{
        ys = -1;
    }

    if (dir.z > origin.z){
        zs = 1;
    }else{
        zs = -1;
    }


    if (dx >= dy && dx >= dz){
        float p1 = 2 * dy - dx;
        float p2 = 2 * dz - dx;
        while (origin.x != dir.x){
            origin.x += xs;

            if (p1 >= 0){
                origin.y += ys;
                p1 -= 2 * dx;
            }

            if (p2 >= 0){
                origin.z += zs;
                p2 -= 2 * dx;
            }
            p1 += 2 * dy;
            p2 += 2 * dz;
            if(getIndex(vec3(origin.x,origin.y,origin.z))==1){
                return true;
            }
        }
    }

    else if (dy >= dx && dy >= dz){
        float p1 = 2 * dx - dy;
        float p2 = 2 * dz - dy;
        while (origin.y != dir.y){
            origin.y += ys;

            if (p1 >= 0){
                origin.x += xs;
                p1 -= 2 * dy;
            }

            if (p2 >= 0){
                origin.z += zs;
                p2 -= 2 * dy;
            }

            p1 += 2 * dx;
            p2 += 2 * dz;
            if(getIndex(vec3(origin.x,origin.y,origin.z))==1){
                return true;
            }
        }


    }

    else{
        float p1 = 2 * dy - dz;
        float p2 = 2 * dx - dz;
        while (origin.z != dir.z){
            origin.z += zs;
            if (p1 >= 0){
                origin.z += ys;
                p1 -= 2 * dz;
            }
            if (p2 >= 0){
                origin.x += xs;
                p2 -= 2 * dz;
            }

            p1 += 2 * dy;
            p2 += 2 * dx;
            if(getIndex(vec3(origin.x,origin.y,origin.z))==1){
                return true;
            }

        }


    }
    return false;

}


void main(){
    vec3 position = cameraPos - vec3(gl_FragCoord.x/1200*2-1,gl_FragCoord.y/900*2-1,1);
    vec3 dir = normalize(position)*100;
    vec3 color = vec3(0,0,0);

    position = vec3(int(position.x),int(position.y),int(position.z));
    dir = vec3(int(dir.x),int(dir.y),int(dir.z));

    if(bresenham(position, dir)){
        color  = vec3(1,1,1);
    }

    fragColor = vec4(color,1);




}

Я не получаю количество ошибок сорта из-за сбоя.Все, что происходит, это черный экран, и после того, как изображение возвращается, я получаю сообщение об ошибке «драйверы nvidia перестали отвечать».

...