openframeworks上的RPI2顶点着色器Texture2D可能
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//<-屏幕截图(我还不能直接嵌入图片。对不起。)
另一张图片是当我发送纹理(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;即不支持顶点纹理。
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 有可能在Armadillo中复制MATLAB circshift方法吗
- GCC对可能有效的代码抛出init list生存期警告
- malloc() 可能出现内存泄漏
- C++quit()函数中可能存在作用域问题
- 变量可能尚未初始化[MIRA 2012规则9.1,强制性]
- 有没有可能有一个只有ADL才能找到的非好友功能
- CLANG 编译器 说:变量"PTR"可能未初始化
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- 有可能使shared_ptr协变吗
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 有可能在信号处理程序中设置promise吗
- 检查向量是否具有所有可能的字符组合
- 跨 DLL 边界访问虚拟方法是否安全/可能?
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- std::背后的基本原理assignable_from可能的实现
- openframeworks上的RPI2顶点着色器Texture2D可能
- 是否有可能在OpenGL中创建几个Texture2D objs的Texture2D_Array ?