[英]Sample texture in GL_POINTS shaders
我有一個着色器,它用固體 colors 繪制粒子。 我想讓着色器對 FBO 紋理進行采樣,以便每個粒子都可以作用於它“背后”的顏色。 似乎它應該很簡單,但沒有。
我已經簡化了代碼,因此我希望我的 FBO 被繪制在每個粒子的表面上,並按比例縮小。 丑陋,但至少可以證明我的粒子可以對紋理進行采樣。 相反,每個粒子只是一種純色。 我正在使用 OpenFrameworks,所以有一些抽象。 我已經驗證tex.bind()
綁定到第一個紋理位置,並且我能夠在沒有GL_POINTS
的情況下將着色器應用於 FBO。
這是我設置着色器、繪制 FBO 和渲染粒子的地方:
void Particles::draw(ofxFBOTexture &tex){
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
ofEnableSmoothing();
glEnable(GL_POINT_SPRITE_ARB);
glEnable(GL_VERTEX_PROGRAM_POINT_SIZE_ARB);
glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE, GL_TRUE);
shader.begin();
shader.setUniform("winWidth", (float) width);
shader.setUniform("winHeight", (float) height);
tex.draw(0,0); // I've tried tex.bind() here too
for(int i = 0; i < lastDead; i++){
allParticles[i]->draw(this->shader);
}
shader.end();
glDisable(GL_VERTEX_PROGRAM_POINT_SIZE_ARB);
glDisable(GL_POINT_SPRITE_ARB);
ofDisableSmoothing();
glDisable(GL_BLEND);
}
// <snip>
void Particle::draw(ofxShader &shader){
if(dead) return;
// this must go outside glBegin
shader.setAttribute("size", size);
shader.setAttribute("velocity", xVel, yVel, 0.0);
glBegin(GL_POINTS);
glColor4f(r, g, b, multiplier * 0.8);
glVertex3f(x, y, 0);
glEnd();
}
這是我的頂點着色器:
#version 120
attribute float size;
attribute vec3 velocity;
varying vec3 vel;
uniform float winWidth;
uniform float winHeight;
void main() {
gl_PointSize = size;
gl_FrontColor = gl_Color;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_TexCoord[0] = gl_TextureMatrix[0] * gl_MultiTexCoord0;
vel = velocity;
}
...以及我的片段着色器的相關摘錄,為調試而簡化:
#version 120
#extension GL_ARB_texture_rectangle : enable
varying vec3 vel;
uniform sampler2DRect tex;
uniform float winWidth;
uniform float winHeight;
void main() {
vec4 texColor = texture2DRect(tex, gl_TexCoord[0].st);
gl_FragColor = texColor;
}
而不是gl_TexCoord[0].st
你需要gl_PointCoord.st 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.