Форум программистов, компьютерный форум, киберфорум
SFML
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/25: Рейтинг темы: голосов - 25, средняя оценка - 4.76
171 / 5 / 2
Регистрация: 27.11.2024
Сообщений: 45

Отрисовка теней GLSL

27.11.2024, 12:34. Показов 9922. Ответов 11

Студворк — интернет-сервис помощи студентам
приветствую. не получается отрисовать тень от объекта.

была идея посылать луч от точки поверхности плоскости, которую видно на экране, до источника света, но попытка привела к провалу:


далее попробовал посылать луч от источника света к рассматриваемой точке поверхности. результат вышел лучше прежнего, но тем не менее результат провальный. взгляните сами:


возможно, надо перемещать базис в рассматриваемую точку поверхности и уже оттуда преобразовывать координаты сферы и источника света, а потом смотреть, встретит ли луч пересечение с объектом.
хотя эта идея может только занять кучу времени и не привести в нужному результату.

возможно, будет лучше, если переместить базис в точку источника света, но тогда нужно проводить повторные пересечения всех точек, что очень ресурсозатратно и не рационально, хотя может получиться.

в целом вопрос такой, есть ли какие-то способы эффективно окрашивать тень?

высылаю код shader.frag:
glSlang
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#version 130
 
uniform vec2 u_WeiHei;
uniform float u_time;
 
const float MAX_DIST = 99999.0;
const vec4 n_field = vec4(0.0, 1.0, 0.0, 1.0);
 
vec2 sphereIntersect(in vec3 ro, in vec3 rd, in vec3 ce, float ra) {
    vec3 co = ro - ce;
    float a = dot(rd, rd);
    float b = 2 * dot(rd, co);
    float c = dot(co, co) - ra * ra;
    float D = b * b - 4.0 * a * c;
    if (D < 0.0) return vec2(-1.0);
    D = sqrt(D);
    vec2 t = vec2((-b - D) / (2.0 * a), (-b + D) / (2.0 * a));
    return t;
}
 
float fieldIntersect(in vec3 ro, in vec3 rd) {
    float denom = dot(rd, n_field.xyz);
    //if (abs(denom) < 1e-6) return -1.0;
    float t = (-dot(n_field.xyz, ro) - n_field.w) / denom;
    return t;
}
 
void shadows(in vec3 intersect_point, in vec3 light, in vec3 sphere_origin, inout vec3 color) {
    vec3 rd = normalize(vec3(intersect_point - light));
    vec2 t_sphere = sphereIntersect(light, rd, sphere_origin, 1.0);
    if (t_sphere.x > 0.0) color *= 0.5;
}
 
vec3 castRay(vec3 ro, vec3 rd) {
    vec3 light = normalize(vec3(cos(u_time), 0.75, sin(u_time)));
    vec3 color;
    vec3 intersect_point; vec3 normal_line; float t_min = MAX_DIST;
    vec3 sphere_origin = vec3(0.0, 0.0, 0.0);
 
    vec2 t_sphere = sphereIntersect(ro, rd, sphere_origin, 1.0);
    float t_field = fieldIntersect(ro, rd);
 
    if (t_sphere.x > 0.0 && t_sphere.x < t_min) {
        t_min = t_sphere.x;
        intersect_point = ro + t_sphere.x * rd;
        normal_line = normalize(intersect_point - sphere_origin);
        color = vec3(1.0, 0.2, 0.1);
    }
    if (t_field > 0.0 && t_field < t_min) {
        t_min = t_field;
        intersect_point = ro + t_field * rd;
        normal_line = n_field.xyz;
        color = vec3(0.5, 0.5, 0.5);
    }
    if (t_min == MAX_DIST) return vec3(-1.0);
    else {
        shadows(intersect_point, light, sphere_origin, color);
        float diffuse = max(0.0, dot(light, normal_line)) * 0.5;
        vec3 reflected = rd - 2.0 * dot(normal_line, rd) * normal_line;
        float specular = pow(max(0.0, dot(reflected, light)), 32.0);
        color *= mix(diffuse, specular, 0.5);
        return color;
    }
}
 
 
vec3 traceRay(vec3 ro, vec3 rd){
    vec3 light = normalize(vec3(cos(u_time), 0.75, sin(u_time)));
    
    vec3 color = castRay(ro, rd); 
    if (color == vec3(-1.0)) return vec3(0.5, 0.8, 0.9);
    
    //if (castRay(ro, light) != vec3(-1.0)) color *= 0.5;
    return color;
}
 
 
void main() {
    vec2 coord_pix = (2 * gl_FragCoord.xy - u_WeiHei.xy) / u_WeiHei.y;
 
    vec3 rayOrigin = vec3(0.0, 0.0, -3.0);
    vec3 rayDirection = normalize(vec3(coord_pix.xy, 1.0));
    vec3 color = traceRay(rayOrigin, rayDirection);
    color.r = pow(color.r, 0.45);
    color.g = pow(color.g, 0.45);
    color.b = pow(color.b, 0.45); 
    gl_FragColor = vec4(color, 1.0);
}
ну входную программу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
namespace CONSTS {
    unsigned int WEIGHT_WINDOW = 1280;
    unsigned int HEIGHT_WINDOW = 720;
}
 
int main()
{
    sf::RenderWindow window(sf::VideoMode(CONSTS::WEIGHT_WINDOW, 720), "RayTracing");
    window.setFramerateLimit(60);
 
    sf::VertexArray quad(sf::Quads, 4);
    quad[0].position = sf::Vector2f(0, 0);
    quad[1].position = sf::Vector2f(CONSTS::WEIGHT_WINDOW, 0);
    quad[2].position = sf::Vector2f(CONSTS::WEIGHT_WINDOW, CONSTS::HEIGHT_WINDOW);
    quad[3].position = sf::Vector2f(0, CONSTS::HEIGHT_WINDOW);
    
    sf::RenderTexture firstTexture;
    firstTexture.create(CONSTS::WEIGHT_WINDOW, CONSTS::HEIGHT_WINDOW);
    sf::Sprite firstTextureSprite = sf::Sprite(firstTexture.getTexture());
 
    sf::Shader shader_fragment;
    shader_fragment.loadFromFile("shader.frag", sf::Shader::Fragment);
 
    sf::Clock clock;
 
    shader_fragment.setUniform("u_WeiHei", sf::Vector2f((float)CONSTS::WEIGHT_WINDOW, (float)CONSTS::HEIGHT_WINDOW));
 
    while (window.isOpen()) {
 
        sf::Event event;
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed) window.close();
        }
        shader_fragment.setUniform("u_time", clock.getElapsedTime().asSeconds());
        //firstTexture.draw(firstTextureSprite, &shader_fragment);
        window.draw(quad, &shader_fragment);
        window.display();
    }
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.11.2024, 12:34
Ответы с готовыми решениями:

Пример теней c#
Добрый день, буду рад Вашей помощи, нужен исходник куба 3д, или другой простой фигуры, с реализовано тенью. Желательно на c#. Спасибо

Центрирование теней
Тень создается с помощью кода: &lt;div style=&quot;background-color: #4a1e22; text-align:center;&quot;&gt;&lt;p style=&quot;position: relative; top: 0px;...

Создание теней
Помогите реализовать тени в программе, или подкиньте какой-либо пример ссылка на проект в mvs12 ниже #include &lt;windows.h&gt; ...

11
1964 / 820 / 114
Регистрация: 01.10.2012
Сообщений: 4,782
Записей в блоге: 2
27.11.2024, 16:35
Лучший ответ Сообщение было отмечено Makiavelly Uber как решение

Решение

Лучи выбрасываются в 3D системе координат, напр в камере или мире - но никак не от экрана. Достичь (лучами) тени от конкретной сферы можно, но на этом успех и кончится, для любого другого объекта сцены придется опять обеспечивать тень. А когда такая тень получилась - она обычно не очень нравится - слишком жесткие/резкие края.

Цитата Сообщение от Makiavelly Uber Посмотреть сообщение
в целом вопрос такой, есть ли какие-то способы эффективно окрашивать тень?
Взять пример битмаповской (буферной) тени, и аккуратно его переписать. Ну или изучать raytrace SDK для крутых видюшек (ну это вряд ли)
1
171 / 5 / 2
Регистрация: 27.11.2024
Сообщений: 45
27.11.2024, 17:36  [ТС]
спасибо за ответ!)

в принципе хочу написать raytrasing. но пока что разбираюсь с рэйкастингом.

тени получились. ошибка заключалась в том, что находя вектор от точки пересечения луча, выпущенного из камеры, и любого объекта (будь то сфера или плоскость) до источника света (который назван rd в функции shаdow), я совсем забыл о том, что вектор источника света light нормализован, а потому было глупостью искать этот самый rd. в качестве направления луча от "точки пересечения" до источника света я брал заранее нормированный light. таким образом, получилось то, чего я и хотел:
Миниатюры
Отрисовка теней GLSL  
0
1964 / 820 / 114
Регистрация: 01.10.2012
Сообщений: 4,782
Записей в блоге: 2
27.11.2024, 23:47
Цитата Сообщение от Makiavelly Uber Посмотреть сообщение
тени получились.
Как-то Вы не очень требовательны к тому что получилось. Хотите потренироваться с лучами - делайте мягкие края тени. Бытует мнение что, мол, все так просто: пересекает - в тени, не пересекает - освещен. Это не так
1
171 / 5 / 2
Регистрация: 27.11.2024
Сообщений: 45
09.12.2024, 11:28  [ТС]
вот, что получилось, используя другую технологию
0
171 / 5 / 2
Регистрация: 27.11.2024
Сообщений: 45
09.12.2024, 11:48  [ТС]
Цитата Сообщение от Igor3D Посмотреть сообщение
Как-то Вы не очень требовательны к тому что получилось
оставлю код, мб кому-нибудь пригодится

shader.frag:
glSlang
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
#version 130
 
uniform float u_time;
uniform float u_sample_part;
uniform vec2 u_WeiHei;
uniform vec2 u_offset_mouse;
uniform vec3 u_pos;
uniform vec2 u_seed1;
uniform vec2 u_seed2;
uniform sampler2D u_sample;
 
 
const vec3 light = normalize(vec3(3.0, 4.0, 3.0));
const float MAX_DIST = 99999.0;
const int COUNT_COLLISIONS = 8;
const vec4 n_field = vec4(0.0, 1.0, 0.0, 1.0);
uvec4 R_STATE;
 
vec2 hash22(vec2 p)
{
    p += u_seed1.x;
    vec3 p3 = fract(vec3(p.xyx) * vec3(.1031, .1030, .0973));
    p3 += dot(p3, p3.yzx+33.33);
    return fract((p3.xx+p3.yz)*p3.zy);
}
 
void rotation(inout vec2 coords, float offset) {
    vec2 temp_coords = coords;
    temp_coords.x = coords.x * cos(offset) - coords.y * sin(offset);
    temp_coords.y = coords.x * sin(offset) + coords.y * cos(offset);
    coords = temp_coords;
}
 
uint TausStep(uint z, int S1, int S2, int S3, uint M)
{
    uint b = (((z << S1) ^ z) >> S2);
    return (((z & M) << S3) ^ b);   
}
 
uint LCGStep(uint z, uint A, uint C)
{
    return (A * z + C); 
}
 
float random()
{
    R_STATE.x = TausStep(R_STATE.x, 13, 19, 12, uint(4294967294));
    R_STATE.y = TausStep(R_STATE.y, 2, 25, 4, uint(4294967288));
    R_STATE.z = TausStep(R_STATE.z, 3, 11, 17, uint(4294967280));
    R_STATE.w = LCGStep(R_STATE.w, uint(1664525), uint(1013904223));
    return 2.3283064365387e-10 * float((R_STATE.x ^ R_STATE.y ^ R_STATE.z ^ R_STATE.w));
}
 
vec3 randomOnSphere() {
    vec3 rand = vec3(random(), random(), random());
 
    float azimut_corner = rand.x * 2.0 * 3.14159265;
    float v = rand.y;
    float polar_corner = acos(2.0 * v - 1.0);
 
    float radius = pow(rand.z, 1.0 / 3.0);
 
    float x = radius * sin(polar_corner) * cos(azimut_corner);
    float y = radius * sin(polar_corner) * sin(azimut_corner);
    float z = radius * cos(polar_corner);
    return vec3(x, y, z);
}
 
vec2 sphereIntersect(in vec3 ro, in vec3 rd, in vec3 ce, float ra) {
    vec3 co = ro - ce;
    float a = dot(rd, rd);
    float b = 2 * dot(rd, co);
    float c = dot(co, co) - ra * ra;
    float D = b * b - 4.0 * a * c;
    if (D < 0.0) return vec2(-1.0);
    D = sqrt(D);
    vec2 t = vec2((-b - D) / (2.0 * a), (-b + D) / (2.0 * a));
    return t;
}
 
float fieldIntersect(in vec3 ro, in vec3 rd) {
    float denom = dot(rd, n_field.xyz);
    //if (abs(denom) < 1e-6) return -1.0;
    float t = (-dot(n_field.xyz, ro) - n_field.w) / denom;
    return t;
}
 
vec2 cubeIntersect(in vec3 ro, in vec3 rd, vec3 boxSize, out vec3 outNormal) 
{
    vec3 m = 1.0/rd; vec3 n = m*ro; vec3 k = abs(m)*boxSize;
 
    vec3 t1 = -n - k;
    vec3 t2 = -n + k;
    float tN = max( max( t1.x, t1.y ), t1.z );
    float tF = min( min( t2.x, t2.y ), t2.z );
 
    if( tN>tF || tF<0.0) return vec2(-1.0); 
    outNormal = (tN>0.0) ? step(vec3(tN),t1) : // ro вне куба
                           step(t2,vec3(tF));  // ro внутри куба
    outNormal *= -sign(rd);
    outNormal *= normalize(outNormal);
    return vec2( tN, tF );
}
 
vec3 castRay(inout vec3 ro, inout vec3 rd, inout bool first_iter) {
    vec4 color;
    vec3 intersect_point; vec3 normal_line; float t_min = MAX_DIST;
    vec3 sphere_origin = vec3(3.0, 0.0, 0.0); vec3 linse_origin = vec3(3.5, 1.0, -4.0); vec3 mirror_origin = vec3(0.5, 0.5, 5.0);
    vec3 luminaire_origin = vec3(-0.3, 1.5, 0.3);
    vec3 cube_origin = vec3(0.0); vec3 cube_size = vec3(1.0); vec3 normal_cube;
 
 
    vec2 t_sphere = sphereIntersect(ro, rd, sphere_origin, 1.0);
    vec2 t_linse = sphereIntersect(ro, rd, linse_origin, 2.0);
    vec2 t_mirror = sphereIntersect(ro, rd, mirror_origin, 1.0);
    vec2 t_luminaire = sphereIntersect(ro, rd, luminaire_origin, 0.5);
 
    float t_field = fieldIntersect(ro, rd);
    vec2 t_cube = cubeIntersect(ro - cube_origin, rd, cube_size, normal_cube);
 
    if (t_sphere.x > 0.0 && t_sphere.x < t_min) {
        t_min = t_sphere.x;
        intersect_point = ro + t_sphere.x * rd;
        normal_line = normalize(intersect_point - sphere_origin);
        color = vec4(1.0, 0.2, 0.1, 0.8);
    }
    if (t_field > 0.0 && t_field < t_min) {
        t_min = t_field;
        intersect_point = ro + t_field * rd;
        normal_line = n_field.xyz;
        color = vec4(0.5, 0.25, 0.1, 0.01);
    }
    if (t_cube.x > 0.0 && t_cube.x < t_min) {
        t_min = t_cube.x;
        intersect_point = ro + t_cube.x * rd;
        normal_line = normal_cube;
        color = vec4(1.0, 0.6, 0.0, 0.5);
    }
    if (t_linse.x > 0.0 && t_linse.x < t_min) {
        t_min = t_linse.x;
        normal_line = normalize(ro + t_linse.x * rd - linse_origin);
        intersect_point = ro + t_linse.y * rd;
        color = vec4(1.0);
    }
    if (t_mirror.x > 0.0 && t_mirror.x < t_min) {
        t_min = t_mirror.x;
        normal_line = normalize(ro + t_mirror.x * rd - mirror_origin);
        intersect_point = ro + t_mirror.y * rd;
        color = vec4(1.0);
    }
    if (t_luminaire.x > 0.0 && t_luminaire.x < t_min) {
        t_min = t_luminaire.x;
        normal_line = normalize(ro + t_luminaire.x * rd - luminaire_origin);
        intersect_point = ro + t_luminaire.y * rd;
        color = vec4(-2.0);
    }
 
 
    if (color == vec4(-2.0)) return color.rgb;
 
    if (t_min == t_linse.x) {
        float fresnel = 1.0 - abs(dot(-rd, normal_line));
        if(random() - 0.1 < fresnel * fresnel) {
            rd = rd - 2.0 * dot(normal_line, rd) * normal_line;
            return color.rgb;
        }
 
        rd = refract(rd, normal_line, 1.0 / 1.5);
        ro = intersect_point + rd * 0.001;
        first_iter = false;
        return color.rgb;
    }
    if (t_min == t_mirror.x) {
        float fresnel = 1.0 - abs(dot(-rd, normal_line));
        if(random() - 0.1 < fresnel * fresnel) {
            rd = rd - 2.0 * dot(normal_line, rd) * normal_line;
            return color.rgb;
        }
 
        rd = -refract(rd, normal_line, 1.0 / 1.5);
        ro = intersect_point + rd * 0.001;
        first_iter = false;
        return color.xyz;
    }
    if (t_min == t_luminaire.x) {
        return color.rgb;
    }
 
 
    if (t_min == MAX_DIST) return vec3(-1.0);
    else {
        vec3 specular = rd - 2.0 * dot(normal_line, rd) * normal_line;
        vec3 rand = randomOnSphere();
        vec3 diffuse = normalize(rand * dot(rand, normal_line));
        rd = mix(diffuse, specular, color.a);
        ro = intersect_point + rd * 0.01;
        first_iter = false;
 
        return color.rgb;
    }
}
 
 
 
 
vec3 traceRay(vec3 ro, vec3 rd){
    vec3 color = vec3(1.0);
    bool first_iter = true;
    float coef = 0.0;
    
    for (int i = 0; i < COUNT_COLLISIONS; i++) {
        vec3 color_reflected_obj = castRay(ro, rd, first_iter); 
        if (color_reflected_obj == vec3(-1.0)) {
            
            if (first_iter) coef = 1.0f; else coef = 0.01f;
            vec3 sky = vec3(0.3, 0.6, 1.0); 
            vec3 sun = vec3(0.95, 0.9, 1.0);
            sun *= max(0.0, pow(dot(rd, light), 256.0));
            //sky *= max(0.0, dot(light, vec3(0.0, 0.0, 1.0)));
            return color * clamp(sun + sky * 0.01, 0.0, 1.0);
        }
        if (color_reflected_obj == vec3(-2.0)) return vec3(0.8, 0.8, 0.8);
        color *= color_reflected_obj;
    } 
    return vec3(0.0);
}
 
 
void main() {
    vec2 coord_pix = (2 * gl_FragCoord.xy - u_WeiHei.xy) / u_WeiHei.y;
 
    vec2 coord_pixes_res = hash22(coord_pix + 1.0) * u_WeiHei + u_WeiHei;
    R_STATE.x = uint(u_seed1.x + coord_pixes_res.x);
    R_STATE.y = uint(u_seed1.y + coord_pixes_res.x);
    R_STATE.z = uint(u_seed2.x + coord_pixes_res.y);
    R_STATE.w = uint(u_seed2.y + coord_pixes_res.y);
 
    vec3 rayOrigin = u_pos;
    vec3 rayDirection = normalize(vec3(coord_pix.xy, 1.0));
    rotation(rayDirection.yz, u_offset_mouse.y);
    rotation(rayDirection.zx, u_offset_mouse.x);
 
    vec3 color = vec3(0.0);
    for (int i = 0; i < 4; i++) {
        color += traceRay(rayOrigin, rayDirection);
    }
    color /= 4;
 
    float white = 20.0;
    float exposure = 12.0;
    color *= white * exposure;
    color = (color * (1.0 + color / white / white)) / (1.0 + color);
 
    vec3 sample_color = texture(u_sample, gl_TexCoord[0].xy).rgb;
    color = mix(sample_color, color, u_sample_part);
 
    gl_FragColor = vec4(color, 1.0);
}
main.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include <iostream>
#include <random>
#include <SFML/Graphics.hpp>
 
namespace CONSTS {
    float WEIGHT_WINDOW = 1920;
    float HEIGHT_WINDOW = 1080;
}
 
void rotation(float& x, float& y, float offset) {
    sf::Vector2f temp_coords(x, y);
    temp_coords.x = x * cos(offset) - y * sin(offset);
    temp_coords.y = x * sin(offset) + y * cos(offset);
    x = temp_coords.x; y = temp_coords.y;
}
 
int main()
{
    std::srand(std::time(NULL));
 
    bool mouse_hidden{ true };
    int framesStill{ 1 };
    float dx{ 0.0 }, dy{ 0.0 }, speed{ 0.1 };
    sf::Vector3f position_camera(0.0, 0.0, -3.0);
    bool movement_buttons[6] = { false, false, false, false, false, false };
 
    sf::RenderWindow window(sf::VideoMode(CONSTS::WEIGHT_WINDOW, CONSTS::HEIGHT_WINDOW), "RayTracing");
    window.setFramerateLimit(60);
    window.setMouseCursorVisible(false);
 
    sf::VertexArray quad(sf::Quads, 4);
    quad[0].position = sf::Vector2f(0, 0);
    quad[1].position = sf::Vector2f(CONSTS::WEIGHT_WINDOW, 0);
    quad[2].position = sf::Vector2f(CONSTS::WEIGHT_WINDOW, CONSTS::HEIGHT_WINDOW);
    quad[3].position = sf::Vector2f(0, CONSTS::HEIGHT_WINDOW);
 
    sf::RenderTexture firstTexture;
    firstTexture.create(CONSTS::WEIGHT_WINDOW, CONSTS::HEIGHT_WINDOW);
    sf::Sprite firstTextureSprite = sf::Sprite(firstTexture.getTexture());
    sf::Sprite firstTextureSpriteFlipped = sf::Sprite(firstTexture.getTexture());
    firstTextureSpriteFlipped.setScale(1, -1);
    firstTextureSpriteFlipped.setPosition(0, CONSTS::HEIGHT_WINDOW);
 
    sf::RenderTexture outputTexture;
    outputTexture.create(CONSTS::WEIGHT_WINDOW, CONSTS::HEIGHT_WINDOW);
    sf::Sprite outputTextureSprite = sf::Sprite(outputTexture.getTexture());
    sf::Sprite outputTextureSpriteFlipped = sf::Sprite(outputTexture.getTexture());
    outputTextureSpriteFlipped.setScale(1, -1);
    outputTextureSpriteFlipped.setPosition(0, CONSTS::HEIGHT_WINDOW);
 
    sf::Shader shader_fragment;
    shader_fragment.loadFromFile("shader.frag", sf::Shader::Fragment);
 
    sf::Clock clock;
 
    shader_fragment.setUniform("u_WeiHei", sf::Vector2f((float)CONSTS::WEIGHT_WINDOW, (float)CONSTS::HEIGHT_WINDOW));
    sf::Mouse::setPosition(sf::Vector2i(CONSTS::WEIGHT_WINDOW / 2, CONSTS::HEIGHT_WINDOW / 2), window);
 
    std::random_device rd;
    std::mt19937 e2(rd());
    std::uniform_real_distribution<> dist(0.0f, 1.0f);
 
    while (window.isOpen()) {
 
        sf::Event event;
        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed) window.close();
 
            if (event.type == sf::Event::KeyPressed) {
                if (event.key.code == sf::Keyboard::Escape) {
                    mouse_hidden = false;
                    window.setMouseCursorVisible(true);
                }
                else if (event.key.code == sf::Keyboard::W) movement_buttons[0] = true;
                else if (event.key.code == sf::Keyboard::A) movement_buttons[1] = true;
                else if (event.key.code == sf::Keyboard::S) movement_buttons[2] = true;
                else if (event.key.code == sf::Keyboard::D) movement_buttons[3] = true;
                else if (event.key.code == sf::Keyboard::Space) movement_buttons[4] = true;
                else if (event.key.code == sf::Keyboard::LControl) movement_buttons[5] = true;
            }
            else if (event.type == sf::Event::KeyReleased)
            {
                if (event.key.code == sf::Keyboard::W) movement_buttons[0] = false;
                else if (event.key.code == sf::Keyboard::A) movement_buttons[1] = false;
                else if (event.key.code == sf::Keyboard::S) movement_buttons[2] = false;
                else if (event.key.code == sf::Keyboard::D) movement_buttons[3] = false;
                else if (event.key.code == sf::Keyboard::Space) movement_buttons[4] = false;
                else if (event.key.code == sf::Keyboard::LControl) movement_buttons[5] = false;
            }
 
            if (event.type == sf::Event::MouseMoved) {
                if (mouse_hidden) {
                    float mx = (event.mouseMove.x - CONSTS::WEIGHT_WINDOW / 2) / (CONSTS::WEIGHT_WINDOW / 2);
                    float my = (event.mouseMove.y - CONSTS::HEIGHT_WINDOW / 2) / (CONSTS::HEIGHT_WINDOW / 2);
 
                    dx += mx;
                    dy += my;
                    sf::Mouse::setPosition(sf::Vector2i(CONSTS::WEIGHT_WINDOW / 2, CONSTS::HEIGHT_WINDOW / 2), window);
 
                    
                    if (mx != 0 || my != 0) framesStill = 1;
                }
            }
        }
 
        sf::Vector3f dir;
        if (movement_buttons[0]) dir = sf::Vector3f(0.0f, 0.0f, 1.0f);
        else if (movement_buttons[2]) dir = sf::Vector3f(0.0f, 0.0f, -1.0f);
        if (movement_buttons[1]) dir = sf::Vector3f(-1.0f, 0.0f, 0.0f);
        else if (movement_buttons[3]) dir = sf::Vector3f(1.0f, 0.0f, 0.0f);
        rotation(dir.y, dir.z, dy);
        rotation(dir.z, dir.x, dx);
        position_camera += dir * speed;
        if (movement_buttons[4]) position_camera.y += speed;
        else if (movement_buttons[5]) position_camera.y -= speed;
        for (int i = 0; i < 6; i++)
        {
            if (movement_buttons[i])
            {
                framesStill = 1;
                break;
            }
        }
 
        float sample_part{ static_cast<float>(1.0 / framesStill) };
        shader_fragment.setUniform("u_sample_part", sample_part);
        shader_fragment.setUniform("u_pos", position_camera);
        shader_fragment.setUniform("u_offset_mouse", sf::Vector2f(dx, dy));
        //shader_fragment.setUniform("u_time", clock.getElapsedTime().asSeconds());
        shader_fragment.setUniform("u_seed1", sf::Vector2f((float)std::rand(), (float)std::rand() * 999.0f));
        shader_fragment.setUniform("u_seed2", sf::Vector2f((float)std::rand(), (float)std::rand() * 999.0f));
 
        if (framesStill % 2 == 1)
        {
            shader_fragment.setUniform("u_sample", firstTexture.getTexture());
            outputTexture.draw(firstTextureSpriteFlipped, &shader_fragment);
            window.draw(outputTextureSpriteFlipped);
        }
        else
        {
            shader_fragment.setUniform("u_sample", outputTexture.getTexture());
            firstTexture.draw(outputTextureSpriteFlipped, &shader_fragment);
            window.draw(firstTextureSpriteFlipped);
        }
 
        //window.draw(quad, &shader_fragment);
        window.display();
 
        framesStill++;
    }
}
1
1964 / 820 / 114
Регистрация: 01.10.2012
Сообщений: 4,782
Записей в блоге: 2
09.12.2024, 17:18
Цитата Сообщение от Makiavelly Uber Посмотреть сообщение
вот, что получилось, используя другую технологию
Ну это скорее "переписанный пример" чем "технология" В этом нет ничего плохого, понимаю что это "набросок" чтобы показать raytrace фичи. И действительно, мягкие тени, стекло, каустика, светящийся объект - ничего этого без raytrace не получить (с буферами можно пыхтеть долго, но результат лучше не показывать). Однако, по меньшей мере, нужно рендерить нормальные объекты, не только сферы и кубы. А как? Это не выглядит реальным.

Да, это весьма полезно расширить свой кругозор, узнать массу новых вещей и.т.п. Но всегда встает вопрос (или возникает мысль) - а где границы этого интересного, полезного, но все же баловства? За ним будет/последует нечто большее? Или как?
1
171 / 5 / 2
Регистрация: 27.11.2024
Сообщений: 45
09.12.2024, 19:57  [ТС]
Цитата Сообщение от Igor3D Посмотреть сообщение
За ним будет/последует нечто большее? Или как?
нет, честно говоря, графику я не люблю) изучал это только из интереса к тому, как происходят вычисления, какие функции используются. писал по видео — обычный просмотр показался мне слишком простой задачей. для меня это было как некоторый чекпоинт, закрытие гештальта.

судя по вашему нику, вам, наоборот, тема моделирования очень даже по душе. творческих успехов! а я пойду выполнять следующие цели — ревёрсинженеринг и вирусология)
0
09.12.2024, 20:32

Не по теме:

Цитата Сообщение от Makiavelly Uber Посмотреть сообщение
а я пойду выполнять следующие цели
летун :)

0
171 / 5 / 2
Регистрация: 27.11.2024
Сообщений: 45
09.12.2024, 20:43  [ТС]
Цитата Сообщение от Igor3D Посмотреть сообщение
летун
0
9037 / 2937 / 494
Регистрация: 05.10.2013
Сообщений: 7,962
Записей в блоге: 216
09.12.2024, 23:12
Цитата Сообщение от Makiavelly Uber Посмотреть сообщение
писал по видео
Опубликуйте, пожалуйста, ссылку на видео.
0
171 / 5 / 2
Регистрация: 27.11.2024
Сообщений: 45
10.12.2024, 13:57  [ТС]


Добавлено через 16 секунд
https://youtu.be/jKjbeWHujV0?si=Rd2PUgiXf_2el5tX

Добавлено через 33 секунды
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Опубликуйте, пожалуйста, ссылку на видео
держите
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.12.2024, 13:57
Помогаю со студенческими работами здесь

Нет теней
Привет. В первом проекте есть тени, а в другом, который является продолжением первого, почему-то их нет. Подскажите, пожалуйста, в...

Дергание теней
Добрый день, недавно разбирался с тенями, поставил ортографическую проекцию охватывающую мир 256 на 256 квадратов (мир не статичен, при...

Карта теней
Здравствуйте. Пытаюсь сделать тени через карту теней в opengl 3.3. и тени не выводятся. вот коды: //вершинный шейдер на вывод уже с...

Изменение теней
Я делаю игру и хочу сделать изменение теней через скрипт, я смотрел на официальном форуме юнити но нечего не нашёл, помогите пожалуйста

Сглаживание теней
Всем привет. Не могу понять, как можно сгладить тень. Создаю ее так: float computeShadow(vec4 vPositionFromLight, sampler2D...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru