Tag: 纹理映射

如何在顶点/片段着色器中使用3×3 2D变换(金属)

我有一个简单的任务,但显然我还是不明白在着色器中的投影是如何工作的。 我需要在纹理四边形(2个三angular形)上进行2D透视变换,但在视觉上它看起来不正确(例如,梯形比CPU版本中的梯形略高或更拉伸)。 我有这个结构: struct VertexInOut { float4 position [[position]]; float3 warp0; float3 warp1; float3 warp2; float3 warp3; }; 在顶点着色器中,我做了类似的事情( texCoords是四angular的像素坐标,单应texCoords是以像素坐标计算的): v.warp0 = texCoords[vid] * homographies[0]; 然后在像这样的片段着色器中: return intensity.sample(s, inFrag.warp0.xy / inFrag.warp0.z); 结果不是我所期望的。 我花了几个小时,但我无法弄清楚。 通风 更新: 这些是CPU的代码和结果(又名预期结果 ): // _image contains the original image cv::Matx33d h(1.03140473, 0.0778113901, 0.000169219566, 0.0342947133, 1.06025684, 0.000459250761, -0.0364957005, -38.3375587, 0.818259298); cv::Mat dest(_image.size(), […]

最有效的多纹理方式 – iOS,OpenGL ES2,优化

我试图find在iOS上的OpenGL ES2中处理多纹理的最有效的方法。 “高效率”是指即使在较老的iOS设备(iPhone 4及更高版本)上也是最快的渲染 – 同时也是平衡方便。 我考虑过(并尝试过)几种不同的方法。 但遇到了一些问题和疑问。 方法1 – 我的基础和正常值是没有ALPHA rgb。 对于这些对象,我不需要透明度。 我的发射和镜面reflection信息只有一个频道。 为了减lesstexture2D()调用我想我可以存储发射作为基地的alpha通道,镜面作为正常的alpha。 每个人都在他们自己的文件中看起来像这样: 到目前为止,我的问题一直在find一个文件格式,将支持完整的非预乘alpha通道。 PNG只是没有为我工作。 每一个我试图把这个保存为PNG的方法都是将.alg与.rgb保存在一起(通过photoshop),基本上破坏了.rgb。 当我重新加载文件时,任何具有0.0阿尔法的像素都有黑色的rgb。 我在这里发布了这个问题没有任何活动。 我知道这种方法会产生更快的渲染,如果我能find一种方法来保存和加载这个独立的第四频道。 但到目前为止,我还没有能够,只好继续前进。 方法2 – 当没有工作,我转向一个单一的4路纹理,每个象限有不同的地图。 这不会减lesstexture2D()调用,但会减less在着色器中访问的纹理数量。 4路纹理确实需要修改着色器中的纹理坐标。 对于模型的灵活性,我将texcoords放在模型的结构中,并在着色器中修改它们,如下所示: v_fragmentTexCoord0 = a_vertexTexCoord0 * 0.5; v_fragmentTexCoord1 = v_fragmentTexCoord0 + vec2(0.0, 0.5); // illumination frag is up half v_fragmentTexCoord2 = v_fragmentTexCoord0 + vec2(0.5, 0.5); // shininess frag […]

为什么1.0的纹理坐标超出了纹理的边缘?

我正在做一个颜色查找使用纹理应用效果的图片。 我的查找是使用第一个纹理片段的亮度的梯度图,然后在第二个纹理上查看。 第二个纹理是256×256,水平渐变和几个不同的渐变从上到下。 所以32个水平条纹每8个像素高。 我在x上的查找是亮度,在y上它是一个渐变,我瞄准条纹的中心,以避免交叉。 我的片段着色器看起来像这样: lowp vec4 source = texture2D(u_textureSampler, v_fragmentTexCoord0); float luminance = 1.0 – dot(source.rgb, W); lowp vec2 texPos; texPos.x = clamp(luminance, 0.0, 1.0); // the y value selects which gradient to use by supplying a T value // this would be more efficient in the vertex shader texPos.y = clamp(u_value4, 0.0, […]

如何在开放的gl纹理的alpha中编码发射或镜面reflection信息

我有一个OpenGL纹理与UV地图上。 我已经读过关于使用alpha通道来存储一些其他的值,从而节省了需要从某个地方加载额外的地图。 例如,您可以在alpha中存储高光信息(发光度)或发射贴图,因为您只需要一个浮点数而不使用alpha。 所以我试了一下。 写着色器不是问题。 我已经完成了所有这一部分。 问题就是让我想要的所有4个通道进入纹理。 我有PSD中的所有地图,我把基本地图放在rgb中,排放地图放在a中。 但是,当你保存为png的alpha不是保存(如果你把它添加为一个新的频道),或通过预先将透明度乘以rgb(如果您将地图作为蒙版)来破坏rgb。 显然PNG文件支持透明度,但本身不支持alpha通道。 所以似乎没有办法控制所有4个通道。 但是我已经读过关于这样做。 那么,我可以从PSD保存它,我可以在iPhone中加载我的图像加载器的格式? NSString *path = [[NSBundle mainBundle] pathForResource:name ofType:type]; NSData *texData = [[NSData alloc] initWithContentsOfFile:path]; UIImage *image = [[UIImage alloc] initWithData:texData]; 此方法是否接受其他文件格式? 像TIFF,这将允许我控制所有4个频道? 我可以使用纹理工具来制作一个PVR ..但是从文档看来,它似乎也采用PNG作为input。 编辑: 首先要清楚这是在iPhone。 这可能是psd的错。 就像我说的,在我可以find的psd(cc 14.2 mac)版本中,有两种方法来设置文档。 一个是手动添加一个新的频道,并粘贴在那里的地图。 它显示为一个红色的覆盖。 第二个是添加一个蒙版,选项点击它并粘贴在那里的阿尔法。 在这种情况下,它显示与阿尔帕作为一个透明的棋盘在阿尔法零区。 当我保存为PNG的alpha选项灰色。 当我把png加载到psd时,它似乎是预乘。 我不能回到我在Photoshop中的完整RGB数据。 是否有一个不同的工具,我可以用来将两个地图合并成一个PNG,将其存储在PNG 32? TIFF将无法正常工作,因为它不会存储alpha。 也许我在想TGA。 我也在我的装载机中注意到了这一点 GLuint […]

OpenGL ES 2.0顶点转换algorithm

我正在使用OpenGL ES 2.0开发图像扭曲的iOS应用程序。 我对设置,pipe道等有很好的把握,现在正在进行math运算。 由于我的图像变形经验是零,我正在接触一些algorithm的build议。 目前,我在网格types的方式设置点的初始顶点,它将图像平分为正方形。 然后,我在每个方块的中间放置一个额外的顶点。 当我绘制索引时,每个正方形都包含四个X形的三angular形。请参见下图: 在用photoshop稍微玩一下之后,我注意到Adobe为他们的木偶使用了一个稍微复杂的algorithm,但是对于他们的标准warp,使用了一个更简单的algorithm。 你认为最适合我在这里/个人的喜好是什么? 其次,当我移动一个顶点时,我想对所有其他顶点应用加权变换来平滑边缘(而不是我下面只有选定顶点被变换的位置)。 我应该在这里应用什么样的algorithm?