在GLSL片段着色器中对纹理进行采样时,如何确定使用的mipmap级别?
我知道我可以使用以下textureLod(...)方法手动采样纹理的特定mipmap级别:
uniform sampler2D myTexture;
void main()
{
float mipmapLevel = 1;
vec2 textureCoord = vec2(0.5, 0.5);
gl_FragColor = textureLod(myTexture, textureCoord, mipmapLevel);
}
Run Code Online (Sandbox Code Playgroud)
或者我可以允许使用texture(...)like 自动选择mipmap级别
uniform sampler2D myTexture;
void main()
{
vec2 textureCoord = vec2(0.5, 0.5);
gl_FragColor = texture(myTexture, textureCoord);
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢后者,因为我相信司机对合适的mipmap级别的判断比我自己的更多.
但我想知道在自动采样过程中使用了什么mipmap级别,以帮助我合理地对附近的像素进行采样.GLSL中是否有一种方法可以访问有关自动纹理样本使用的mipmap级别的信息?
我试图搞砸SceneKit并自学它.基本上,我正在创建一个带有3个矩形边和1个倾斜滑块的四边形.
我希望我的纹理在表面上伸展和变形/变形.
在线阅读一些内容,似乎我需要SCNProgram使用自定义顶点和片段着色器来获得效果.但是,我似乎无法让纹理在表面上传播.需要帮助.(我是图形编程的新手,因此试图教给我自己).
我的Swift代码创建几何和纹理如下:
func geometryCreate() -> SCNNode {
let verticesPosition = [
SCNVector3Make(0.0, 0.0, 0.0),
SCNVector3Make(5.0, 0.0, 0.0),
SCNVector3Make(5.0, 5.0, 0.0),
SCNVector3Make(0.0, 3.0, 0.0)
]
let textureCord = [CGPoint (x: 0.0,y: 0.0), CGPoint(x: 1.0,y: 0.0), CGPoint(x: 1.0,y: 1.0), CGPoint(x: 0.0,y: 1.0)]
let indices: [CInt] = [
0, 2, 3,
0, 1, 2
]
let vertexSource = SCNGeometrySource(vertices: verticesPosition, count: 4)
let srcTex = SCNGeometrySource(textureCoordinates: textureCord, count: 4)
let date = NSData(bytes: indices, length: sizeof(CInt) * …Run Code Online (Sandbox Code Playgroud) 短:
我可以定义每个着色器可以使用的函数吗?或者我必须为每个着色器定义它?
整个故事:
我想创建许多着色器,用于使用预定义的渐变斜坡着色输入片段(类似于这样 - http://www.thinkboxsoftware.com/storage/krakatoa-support-images/krakatoa15_kcm_densitybyage_gradientrampmap.png).
我想为每个着色器定义一个渐变渐变常数(一个vec4颜色样本数组,其中alpha值保持渐变位置,请参见上图中的Pos)
我需要一个函数,可以从给定的渐变斜坡返回特定纹理坐标位置的颜色样本.
因此,坡道必须每个着色器定义一次,并且功能应该界定一次性每个着色器可以放心地使用.
我有算法,问题是共享函数,并在GLSL中定义常量.
这可能吗?或者我必须将函数复制到每个着色器?至少有一些预编译选项吗?
我目前正在对OpenGL和着色器进行一些研究,但我似乎无法弄清楚glBlendMode在着色器中使用混合模式或在着色器中编写自己的混合模式之间是否存在任何根本差异.
选择前者或后者的原因是什么?通过选择一个而不是另一个会有任何性能瓶颈吗?或者这仅仅是个人偏好的问题?
I want to access the depth buffer value at the currently processed pixel in a pixel shader.
How can we achieve this goal? Basically, there seems to be two options:
我想在具有景深效果的3D画布(处理中)上显示数千个点.更具体地说,我想使用z缓冲区(深度缓冲)来调整point基于其与相机的距离的模糊水平.
到目前为止,我可以提出以下点着色器:
pointfrag.glsl
#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif
varying vec4 vertColor;
uniform float maxDepth;
void main() {
float depth = gl_FragCoord.z / gl_FragCoord.w;
gl_FragColor = vec4(vec3(vertColor - depth/maxDepth), 1) ;
}
Run Code Online (Sandbox Code Playgroud)
pointvert.glsl
uniform mat4 projection;
uniform mat4 modelview;
attribute vec4 position;
attribute vec4 color;
attribute vec2 offset;
varying vec4 vertColor;
varying vec4 vertTexCoord;
void main() {
vec4 pos = modelview * position;
vec4 clip = projection * pos;
gl_Position = clip + projection * …Run Code Online (Sandbox Code Playgroud) 有人知道如何switch case在三星Galaxy S2上的片段着色器中进行语法处理吗?我得到编译错误:Expected literal or '(', got 'switch'.
我的语法如下:
switch(i){
case 0: x = alphas[0]; break;
case 1: //...etc.
}
Run Code Online (Sandbox Code Playgroud)
这在Nexus 7上工作正常,但在Galaxy S2上我得到了上述错误.是否switch case说明根本不可能在Galaxy S2?我想要使用它们的原因是它们似乎比if elseNexus 7 提供了性能提升.如果它们在Galaxy S2上是不可能的,有没有办法查询设备并使用(switch case如果可用),if else否则?
我在GLSL中实现了高斯模糊片段着色器.我理解所有这些背后的主要概念:卷积,使用线性分离x和y,多次传递以增加半径......
我仍然有几个问题:
sigma和radius之间的关系是什么?
我已经读过sigma相当于radius,我不知道sigma是如何用像素表示的.或者"半径"只是sigma的名称,与像素无关?
我该如何选择西格玛?
考虑到我使用多次传球来增加sigma,我如何选择一个好的sigma来获得我想要的sigma在任何给定的传球?如果得到的sigma等于sigma 和sigma 的平方和的平方根相当于半径,那么获得任何所需半径的简单方法是什么?
什么是内核的好大小,它与sigma有什么关系?
我见过大多数实现都使用5x5内核.对于具有良好质量的快速实现而言,这可能是一个不错的选择,但是还有另一个选择另一个内核大小的理由吗?sigma如何与内核大小相关?我应该找到最好的sigma,以便我的内核之外的系数可以忽略不计并且正常化吗?
我的任务是通过Stage3d(Adobe Flash)技术渲染二次贝塞尔曲线(路径),该技术没有开箱即用的任何扩展(而OpenGl拥有它,据我所知).是的,有一个Starling-Extension-Graphics,但是它使用简单的方法将曲线段划分为许多直线,这为我的长曲线路径生成了很多三角形.
所以..有一种完美的方式来渲染Loop和Blinn的分辨率独立形状.我已经阅读了GPUGems3文章(gpugems3_ch25.html)并将该片段着色器移植到AGAL2:
二次曲线像素着色器
float4 QuadraticPS(float2 p : TEXCOORD0,
float4 color : COLOR0) : COLOR
{
// Gradients
float2 px = ddx(p);
float2 py = ddy(p);
// Chain rule
float fx = (2*p.x)*px.x - px.y;
float fy = (2*p.x)*py.x - py.y;
// Signed distance
float sd = (p.x*p.x - p.y)/sqrt(fx*fx + fy*fy);
// Linear alpha
float alpha = thickness - abs(sd);
if (alpha > 1) // Inside
color.a = 1;
else if (alpha < 0) // Outside
clip(-1);
else
// …Run Code Online (Sandbox Code Playgroud) 我正在使用本教程中的以下代码对WebGL中的片段着色器中的浮点纹理执行线性过滤:
float fHeight = 512.0;
float fWidth = 1024.0;
float texelSizeX = 1.0/fWidth;
float texelSizeY = 1.0/fHeight;
float tex2DBiLinear( sampler2D textureSampler_i, vec2 texCoord_i )
{
float p0q0 = texture2D(textureSampler_i, texCoord_i)[0];
float p1q0 = texture2D(textureSampler_i, texCoord_i + vec2(texelSizeX, 0))[0];
float p0q1 = texture2D(textureSampler_i, texCoord_i + vec2(0, texelSizeY))[0];
float p1q1 = texture2D(textureSampler_i, texCoord_i + vec2(texelSizeX , texelSizeY))[0];
float a = fract( texCoord_i.x * fWidth ); // Get Interpolation factor for X direction.
// Fraction near to valid data.
float pInterp_q0 …Run Code Online (Sandbox Code Playgroud) fragment-shader ×10
glsl ×6
shader ×4
opengl ×3
opengl-es ×3
algorithm ×1
android ×1
bezier ×1
depth-buffer ×1
gaussian ×1
gaussianblur ×1
ios ×1
ios9 ×1
mipmaps ×1
processing ×1
scenekit ×1
stage3d ×1
textures ×1
webgl ×1