2016-10-17 7 views
0

Я новичок в OpenGL и glsl и пытаюсь использовать его на RPI2. Я сделал свой первый пример практики OpenGL 2.1 и glsl version120. Теперь я работаю над OpenGLES 2.0.openframeworks на RPI2 Vertex shader Texture2D возможно?

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

Итак, я сделал один массив для значений поплавков для хранения и передачи этих значений одному 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, &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.

EDIT

Этот снимок экрана ниже, что я хочу сделать с помощью вершинных шейдеров. В настоящее время в этом случае я отправляю значение float для оси x и y (от 0 до размера экрана, которое в этом случае составляет 960,0), до равномерного для отображения вершинности. Каждая строка имеет две вершины. У одной фиксированной позиции есть функция 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 // < -sccreen выстрел (я не могу вставлять фотографии еще напрямую. Извините.)

Другая картина, когда я посылаю текстуру (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

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

+0

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

+0

Какие ценности вы примете в форму? Является ли ваша выходная координата вызывающе внутри объема пространства клипа (+ 1/-1 куб)? – solidpixel

ответ

0

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

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

+0

Благодарим вас за ответ. – LeeSangbong

+0

Извините за плохой пост. В коде inx ниже я набрал GL_MAX_VERTEX_TEXTURE_IMAGE_UNIT в запросе. – LeeSangbong

Смежные вопросы