openframeworks上的RPI2顶点着色器Texture2D可能

openframeworks on RPI2 Vertex shader Texture2D possible?

本文关键字:Texture2D 可能 上的 RPI2 顶点 openframeworks      更新时间:2023-10-16

我是OpenGL和glsl的新手,并试图在RPI2上使用它。我在OpenGL 2.1和glsl version120上做了我的第一个实践例子。现在我正在开发OpenGLES 2.0。

我想做的是将浮动值存储到纹理并将其发送到顶点着色器以制作线条。

所以,我为浮点值创建了一个数组来存储,并将这些值传递给一个FBO。我把这个FBO发送给UniformTexture。但似乎顶点着色器没有得到任何值。

OpenGL ES 2.0文档声明"纹理查找函数可用于顶点和片段着色器。"我还检查了RPI2中的GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS,它返回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。

编辑

下面的屏幕截图是我想用顶点着色器绘制的。目前在这种情况下,我发送鼠标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//<-屏幕截图(我还不能直接嵌入图片。对不起。)

另一张图片是当我发送纹理(FBO)到顶点着色器。我创建了一个数组,并为每个x, y位置设置200.0浮动值,并将该数组加载到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

我希望这有助于你对我的问题有更多的了解。谢谢你的回复。我真的很感激。

您正在检查错误的查询-检查GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS

在大多数GLES 2.0实现中,这将返回0;即不支持顶点纹理。