簡體   English   中英

RPI2頂點着色器Texture2D上的openframeworks可能嗎?

[英]openframeworks on RPI2 Vertex shader Texture2D possible?

我是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 // <-screwen鏡頭(我還不能直接嵌入圖片。對不起。)

另一張圖片是當我將Texture(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實現中,它將返回零。 即不支持頂點紋理。 它在GLES 3.x中是必需的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM