возможно ли openframeworks на текстуре вершинного шейдера RPI2D?

#c #opengl-es #raspberry-pi2 #openframeworks

#c #opengl-es #raspberry-pi2 #openframeworks

Вопрос:

Я новичок в OpenGL и glsl и пытаюсь использовать его на RPI2. Я сделал свой первый практический пример на OpenGL 2.1 и glsl версии 120. Сейчас я работаю над OpenGLES 2.0.

Что я хочу сделать, так это сохранить значения с плавающей точкой в текстуре и отправить ее в вершинный шейдер для создания строк.

Итак, я создал один массив для хранения значений с плавающей запятой и передачи этих значений в один FBO. И я отправляю этот FBO в UniformTexture. Но, похоже, вершинный шейдер не получает никаких значений.

В документе OpenGL ES 2.0 указано, что «Функции поиска текстур доступны как для вершинных, так и для фрагментных шейдеров». Также я проверил GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS в RPI2, и он возвращает 8. К сожалению, я не могу получить какие-либо значения из текстуры, которые я отправляю в вершинный шейдер.

Чего мне здесь не хватает? Я также разместил этот вопрос на форуме openframeworks. Любая помощь будет оценена. Я действительно надеюсь. Спасибо!

код вершинного шейдера

 precision highp float;

uniform mat4 modelViewProjectionMatrix;
uniform sampler2D valTex;
uniform vec2 spaceSize;

attribute vec4 position;
attribute vec2 texcoord;

void main() {

    vec4 pixPos = position;

    vec2 valAmt = texture2D(valTex, texcoord).xy;
    valAmt.x *= spaceSize.x;
    valAmt.y *= spaceSize.y;

    vec2 nPos;
    nPos.x =  (pixPos.x   valAmt.x);
    nPos.y =  (pixPos.y   valAmt.y);

    if ((v_pos.x <= 1.0)) {
        gl_Position = modelViewProjectionMatrix * vec4(pixPos.x, pixPos.y, 0, 1);
    }else{
        gl_Position = modelViewProjectionMatrix * vec4(nPos.x, nPos.y, 0, 1);
    }
}
  

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

 void main() {

    gl_FragColor = vec4(1.0, 1.0, 0.5, 1.0);
}
  

OFX-КОД

 #include "ofApp.h"

void ofApp::setup(){

    string ShaderFolder;
    ShaderFolder = "shader_gles";
    renderShader.load(ShaderFolder   "/fluidRender.vert", ShaderFolder   "/fluidRender.frag");

    renderFbo.allocate(spaceSize, spaceSize, GL_RGB); //Render to Screen 
    renderFbo.begin();
    ofClear(0);
    renderFbo.end();

    valTex.allocate(gridSize, gridSize, GL_RGB); //Store values from array
    valTex.begin();
    ofClear(0);
    valTex.end();

    int vertexNum = gridSize * gridSize;

    vector<float> val(vertexNum * 3); //Store values

    for (int x = 0; x < gridSize; x  ) {
        for (int y = 0; y < gridSize; y  ) {
            val[((x * 3 * gridSize)   y * 3)   0] = 200.0; //x pos value
            val[((x * 3 * gridSize)   y * 3)   1] = 200.0; //y pos value
            val[((x * 3 * gridSize)   y * 3)   2] = 0.0;
        }
    }
    valTex.getTexture().loadData(val.data(), gridSize, gridSize, GL_RGB);

    mesh.setMode(OF_PRIMITIVE_LINES);

    for (int x = 0; x < gridSize; x  ) {
        for (int y = 0; y < gridSize; y  ) {

            mesh.addVertex(ofVec3f(x * cellSize, y * cellSize)); //center vertex
            mesh.addTexCoord(ofVec2f(1.1, 1.1));

            mesh.addVertex(ofVec3f(x * cellSize, y * cellSize)); //val vertex
            mesh.addTexCoord(ofVec2f(x / gridSize - 1, y / gridSize - 1)); //normalize texcoord

            mesh.addIndex((x * 2) * gridSize   (y * 2)   0);
            mesh.addIndex((x * 2) * gridSize   (y * 2)   1);
        }
    }
    glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, amp;vertex_texture_units);
}

void ofApp::update(){
    vertexRender();
}

void ofApp::draw(){
    ofBackground(0);
    renderFbo.draw(0, 0);
    ofDrawBitmapString("v_tex_unit : "   ofToString(vertex_texture_units), 15, 15);
}

void ofApp::vertexRender(){
    renderFbo.begin();

    ofClear(0);
    renderShader.begin();
    renderShader.setUniformTexture("velTex", valTex.getTexture(), 0);
    renderShader.setUniform2f("spaceSize", spaceSize, spaceSize);
    mesh.draw();
    renderShader.end();

    renderFbo.end();
}
  

ПРИМЕЧАНИЕ
В описании нет GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS. Это GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS в коде.

Редактировать

Этот снимок экрана ниже — это то, что я хочу нарисовать с помощью вершинного шейдера. В настоящее время в этом случае я отправляю значение с плавающей запятой в позициях мыши x и y (от 0 до размера экрана, который в данном случае равен 960.0) в uniform для отображения значения vertex. Каждая строка имеет две вершины. У одного есть фиксированная позиция, которая находится в функции ‘addVertex (x, y)’.

 mesh.addVertex(ofVec3f(x * cellSize, y * cellSize));
  

Другой имеет «фиксированное значение позиции значение положения мыши». Таким образом, если мышь перемещается, она создает линию, соединяющую вершину с фиксированным положением и вершину «фиксированное положение положение мыши».

 renderShader.setUniform2f("mousePos", mouseX, mouseY);
  

в GLSL

 vec2 pixPos = position;
vec2 nPos;
nPos.x =  (pixPos.x   mousePos.x);
nPos.y =  (pixPos.y   mousePos.y);
  

vertex_mouse_position //<-снимок экрана (я пока не могу вставлять изображения напрямую. извините.)

Другая картина — это когда я отправляю текстуру (FBO) в вершинный шейдер. Я создал массив и установил значение 200.0 с плавающей запятой для каждой позиции x, y и загрузил этот массив в FBO.

 vector<float> val(vertexNum * 3); //Store values

    for (int x = 0; x < gridSize; x  ) {
        for (int y = 0; y < gridSize; y  ) {
            val[((x * 3 * gridSize)   y * 3)   0] = 200.0; //x pos value
            val[((x * 3 * gridSize)   y * 3)   1] = 200.0; //y pos value
            val[((x * 3 * gridSize)   y * 3)   2] = 0.0;
        }
    }
    valTex.getTexture().loadData(val.data(), gridSize, gridSize, GL_RGB);
  

затем отправьте этот FBO в вершинный шейдер.

 renderShader.setUniformTexture("velTex", valTex.getTexture(), 0);
  

Но я просто получаю черный экран, отображающий примечание.

vertex_texture

Я надеюсь, что это поможет вам лучше понять мою проблему. Спасибо за ответ. Я действительно ценю.

Комментарии:

1. Что вы на самом деле подразумеваете под «к сожалению, я не могу получить какие-либо значения из текстуры, которые я отправляю в вершинный шейдер». Какое фактическое поведение / ошибку вы получаете?

2. Какие значения вы передаете в форму? Ваша выходная координата вызывающе находится внутри объема пространства клипа ( 1 /-1 куб)?

Ответ №1:

Вы проверяете неправильный запрос — проверьте GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS .

В большинстве реализаций GLES 2.0 это вернет ноль; т. Е. текстурирование вершин не поддерживается. Это обязательно в GLES 3.x.

Комментарии:

1. Извините за плохой пост. В приведенном ниже коде ofx я ввел GL_MAX_VERTEX_TEXTURE_IMAGE_UNIT в запросе.