我正在尝试从图形纸中实现算法,并且算法的一部分将已知半径的球体渲染到缓冲区.他们说他们通过计算顶点着色器中的位置和大小来渲染球体,然后在片段着色器中进行适当的着色.
有没有猜到他们实际上是怎么做到的?位置和半径在世界坐标中是已知的,投影是透视的.这是否意味着球体将被投影为圆圈?
我正在尝试使用着色器来修改绑定到帧缓冲区的纹理,但我对着色器如何获得"原始"输入值感到困惑.
我正在做以下事情:
GLuint textureId = 0;
glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_2D, textureId);
glTexImage2D(GL_TEXTURE_2D, ...);
GLuint framebufferId = 0;
glGenFramebuffers(1, &framebufferId);
glBindFramebuffer(GL_FRAMEBUFFER, frameBufferId);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, textureId, 0);
glBindTexture(GL_TEXTURE_2D, 0);
GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (status != GL_FRAMEBUFFER_COMPLETE) { ... }
glUseProgram(programId);
const GLenum buffer = GL_COLOR_ATTACHMENT0;
glDrawBuffers(1, &buffer);
Run Code Online (Sandbox Code Playgroud)
空顶点和片段着色器看起来像什么?由于我没有绘制灵长类动物,如何设置gl_Position顶点着色器?如何通过输入颜色作为片段着色器的输出颜色?
空顶点着色器:
#version 330
void main()
{
gl_Position = ??;
}
Run Code Online (Sandbox Code Playgroud)
空片段着色器:
#version 330
layout(location = 0) out vec4 out_colour;
void main()
{
out_colour = ???;
}
Run Code Online (Sandbox Code Playgroud) 我的9600GT讨厌我.
片段着色器:
#version 130
uint aa[33] = uint[33](
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0
);
void main() {
int i=0;
int a=26;
for (i=0; i<a; i++) aa[i]=aa[i+1];
gl_FragColor=vec4(1.0,0.0,0.0,1.0);
}
Run Code Online (Sandbox Code Playgroud)
如果a=25程序以3000 fps运行.
如果a=26程序以20 fps运行.
如果aa未出现<= 32问题的大小.
视口大小为1000x1000.
仅当大小aa> 32 时才会出现问题.
的值a作为阈值与调用循环内的阵列变化(aa[i]=aa[i+1]+aa[i-1]给出了不同的期限).
我知道gl_FragColor已被弃用.但那不是问题.
我的猜测是,如果> 25且大小(aa)> 32,GLSL不会自动展开循环.为什么.它取决于阵列大小的原因是人类所不知道的.
这里解释了一个非常相似的行为:http:
//www.gamedev.net/topic/519511-glsl-for-loops/
手动展开循环确实解决了问题(3000 fps),即使aa大小> 32:
aa[0]=aa[1];
aa[1]=aa[2];
aa[2]=aa[3];
aa[3]=aa[4];
aa[4]=aa[5];
aa[5]=aa[6];
aa[6]=aa[7];
aa[7]=aa[8];
aa[8]=aa[9];
aa[9]=aa[10];
aa[10]=aa[11];
aa[11]=aa[12];
aa[12]=aa[13];
aa[13]=aa[14];
aa[14]=aa[15]; …Run Code Online (Sandbox Code Playgroud) 我必须做一个功课,我尝试实现lookAt功能.我试过很多方面,但我得到的唯一结果是蓝屏.我的程序的其余部分工作很大,事实上,如果我使用glm :: lookAt一切都很好.这是我的代码:
mat4 Transform::lookAt(const vec3 &eye, const vec3 ¢er, const vec3 &up)
{
vec3 w(glm::normalize(eye - center)) ;
vec3 u(glm::normalize(glm::cross(up, w)));
vec3 v(glm::cross(w, u)) ;
mat4 ret = mat4 (
vec4 (u.x,v.x,w.x,0),
vec4 (u.y,v.y,w.y,0),
vec4 (u.z,v.z,w.z,0),
vec4 (-u.x*eye.x-u.y*eye.y-u.z*eye.z,
-v.x*eye.x-v.y*eye.y-v.z*eye.z,
-w.x*eye.x-w.y*eye.y-w.z*eye.z,
1)
);
return ret;
Run Code Online (Sandbox Code Playgroud) 我有一个OpenGL着色器,它使用gl_TexCoord,如下所示.但在OpenGL ES中,不支持gl_TexCoord.我想知道如何重构代码以使其在OpenGL ES上运行.
void main()
{
//scene depth calculation
float depth = linearize(texture2D(inputImageTexture2,gl_TexCoord[0].xy).x);
if (depthblur)
{
depth = linearize(bdepth(gl_TexCoord[0].xy));
}
...
}
Run Code Online (Sandbox Code Playgroud) 我已经为现代OpenGL版本重新实现了OpenCSG.
PixelFormatAttributes:
NSOpenGLPFAColorSize , 24 ,
NSOpenGLPFAAlphaSize , 8 ,
NSOpenGLPFADepthSize , 32 ,
NSOpenGLPFAStencilSize , 8 ,
NSOpenGLPFAAccelerated ,
NSOpenGLPFADoubleBuffer ,
NSOpenGLPFASupersample ,
NSOpenGLPFASampleBuffers, 1 ,
NSOpenGLPFASamples , 4 ,
Run Code Online (Sandbox Code Playgroud)
FBO规格:( 尝试使用多重采样渲染到FBO,但线条越来越强大且可见,请查看底部的屏幕截图)
- 创建功率为2的纹理,GL_RGBA(尝试过GL_RGBA8和GL_RGBA32F)
- GL_DEPTH24_STENCIL8(尝试过GL_DEPTH32_STENCIL8,没有结果)
简单算法Goldfeather:
while (i < depth complexity) {
take channel for render
merge layers if no free channel
render each layer with stencil func, mask and depth params to channel (FBO)
}
merge layers (taking texture from FBO and render objects again …Run Code Online (Sandbox Code Playgroud) 我目前正试图让这个散景着色器与GPUImage一起使用:http://blenderartists.org/forum/showthread.php?237488-GLSL-depth-of-field-with-bokeh-v2-4-(update )
这就是我现在所拥有的:
precision mediump float;
varying highp vec2 textureCoordinate;
varying highp vec2 textureCoordinate2;
uniform sampler2D inputImageTexture;
uniform sampler2D inputImageTexture2;
uniform float inputImageTextureWidth;
uniform float inputImageTextureHeight;
#define PI 3.14159265
float width = inputImageTextureWidth; //texture width
float height = inputImageTextureHeight; //texture height
vec2 texel = vec2(1.0/width,1.0/height);
//uniform variables from external script
uniform float focalDepth; //focal distance value in meters, but you may use autofocus option below
uniform float focalLength; //focal length in mm
uniform float fstop; //f-stop value
bool …Run Code Online (Sandbox Code Playgroud) 我是glsl的新手.我发现每个演示https://www.shadertoy.com/new都有一个变量iResolution ,这是什么意思?如果我想将此变量传递给着色器,我还需要做什么?
我有一个非常简单的PNG纹理:一个带有透明背景的灰色圆圈.

我使用它作为一个统一map的THREE.ShaderMaterial:
var uniforms = THREE.UniformsUtils.merge( [basicShader.uniforms] );
uniforms['map'].value = THREE.ImageUtils.loadTexture( "img/particle.png" );
uniforms['size'].value = 100;
uniforms['opacity'].value = 0.5;
uniforms['psColor'].value = new THREE.Color( 0xffffff );
Run Code Online (Sandbox Code Playgroud)
这是我的片段着色器(只是其中的一部分):
gl_FragColor = vec4( psColor, vOpacity );
gl_FragColor = gl_FragColor * texture2D( map,vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y ) );
gl_FragColor = gl_FragColor * vec4( vColor, 1.0 );
Run Code Online (Sandbox Code Playgroud)
我将材料应用于某些粒子(THREE.PointCloud网格)并且效果很好:

但如果我将相机旋转超过180度,我会看到:

我知道片段着色器没有正确考虑PNG纹理的alpha值.
在这种情况下,最好的方法是什么,以获得正确的颜色和不透明度(来自自定义属性)并仍然从PNG获得alpha权限?
为什么一方面表现正常?
我有一个 NV21 (YUV420) 相机视频,我在其上应用了片段着色器,以获得一些滤镜效果以及 YUV 到 RGB 的转换。除了性能不佳之外,一切都正常。我的片段着色器有点重,因为它有很多textur2D()调用。
原始帧分辨率是 480x640 像素,我注意到,如果我将视口设置为这个原始大小(而不是全屏大小),它就会工作得很好且流畅。
所以基本上我需要首先渲染帧并在帧缓冲区(FBO)中以原始大小处理它,然后(在着色器工作完成后)使用视口(主要是 1080x1920)将其缩放到全屏大小,这意味着“繁重的”处理工作将应用于少得多的碎片。
我在这里找到了一些教程和类似的问题如何实现这一点,但不幸的是我对此没有运气。(出现一些黑屏或 GL_INVALID_OPERATION 等)...任何帮助将不胜感激。
另外,我不知道如何处理(如果可能的话)的另一个(可选)性能调整是以某种方式将这 3 个纹理(Y_tex、U_tex 和 V_tex)组合为单个纹理,该纹理将统一到着色器作为单个纹理采样器,然后我只需texture2D()在着色器中进行一次调用即可获取当前的 YUV 值并将其转换为 RGB 值。
这是我的渲染器代码:
static class MyRenderer implements GLSurfaceView.Renderer
{
int mTextureIds[] = new int[3];
float[] mScaleMatrix = new float[16];
private FloatBuffer mVertexBuffer;
private FloatBuffer mTextureBuffer;
private ShortBuffer mDrawListBuffer;
boolean mVideoFitEnabled = true;
boolean mVideoDisabled = false;
// number of coordinates per vertex in this array
static final int COORDS_PER_VERTEX = 3;
static final …Run Code Online (Sandbox Code Playgroud)