это мой фрагментный шейдер для рендера трассировки лучей.Я реализовал порт алгоритма рисования линий 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 перестали отвечать».