WebGL интерполировать с эталонным цветом внутри треугольника

Файл для чтения был открыт только для записи.

Фактический объект std::string не может быть записан таким образом. Фактический объект обычно содержит пару указателей и, возможно, размер, но не фактические данные символов.

Если вы собираетесь писать C ++, вам следует подумать об использовании файловых потоков, а не о том, что у вас здесь.

#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <io.h>
#include <iostream>
#include <string>
#include <vector>

typedef struct s_test
{
    char cmd[5];
    std::string str;
}t_test;

void Write(int fd, struct s_test* test)
{
    write(fd, test->cmd, sizeof(test->cmd));
    unsigned int sz = test->str.size();
    write(fd, &sz, sizeof(sz));
    write(fd, test->str.c_str(), sz);
}

void Read(int fd, struct s_test* test)
{
    read(fd, test->cmd, sizeof(test->cmd));
    unsigned int sz;
    read(fd, &sz, sizeof(sz));
    std::vector<char> data(sz);
    read(fd, &data[0], sz);
    test->str.assign(data.begin(), data.end());
}

int main()
{
    t_test test;
    int fd = open("test", O_APPEND | O_CREAT | O_TRUNC | O_WRONLY, 0666);

    test.cmd[0] = 's';
    test.cmd[1] = 'm';
    test.cmd[2] = 's';
    test.cmd[3] = 'g';
    test.cmd[4] = 0;
    test.str = "hello world";
    std::cout << "Before Write: " << test.cmd << " " << test.str << std::endl;

    Write(fd, &test);
    close(fd);

    fd = open("test", O_RDONLY, 0666);
    t_test test2;
    Read(fd, &test2);
    std::cout << "After Read: " << test2.cmd << " " << test2.str << std::endl;
    close(fd);

    return (0);
}
1
задан Rabbid76 5 March 2019 в 20:37
поделиться

1 ответ

Вы должны определить 2 равномерных переменные One для координат исходной точки и один для цвета опорной точки:

uniforms: {
    scale: regl.prop('scale'),
    refPoint: [0, 0],
    refColor: [1, 1, 1]
}

Проходят вершина координат от вершины шейдер в пиксельный шейдер с помощью varying переменной:

precision mediump float;

uniform float scale;

attribute vec2 position;
attribute vec3 color;

varying vec2 fpos;
varying vec3 fcolor;

void main()
{
    fpos        = position;
    fcolor      = color;
    gl_Position = vec4(scale * position, 0, 1);
}

Вычислить расстояние от опорной точки к интерполируемому позиции в пиксельный шейдер, с помощью distance : [1115 ]

float dist = distance(refPoint, fpos);

Интерполировать цвета, зависящие от расстояния, с помощью mix :

vec3 micColor = mix(refColor, fcolor, dist);

Фрагмент шейдера:

precision mediump float;

uniform vec2 refPoint;
uniform vec3 refColor;

varying vec2 fpos;
varying vec3 fcolor;

void main()
{
    float dist    = distance(refPoint, fpos);
    vec3 micColor = mix(refColor, fcolor, dist);
    gl_FragColor  = vec4(sqrt(micColor), 1);
}

0
ответ дан Rabbid76 5 March 2019 в 20:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: