我有一个3d点,定义为[x0, y0, z0].
这一点属于一个平面,由[a, b, c, d].
normal= [a, b, c],和ax + by + cz + d = 0
如何将3d点转换或映射到一对(u,v)坐标?
这一定非常简单,但我无法理解.
我正在关注这个苹果文档,但出于某种原因,当我在XCode的Build Settings下搜索"Sprite"时,没有弹出任何内容.我也尝试过搜索"启用纹理图集生成",但没有任何结果.
如果有帮助,我有Xcode 5.0.2.
我正在模型的多个网格上渲染不同的纹理,但我没有太多关于这些过程的线索.有人为每个网格建议,创建自己的描述符集并调用vkCmdBindDescriptorSets()和vkCmdDrawIndexed()进行渲染,如下所示:
// Pipeline with descriptor set layout that matches the shared descriptor sets
vkCmdBindPipeline(...pipelines.mesh...);
...
// Mesh A
vkCmdBindDescriptorSets(...&meshA.descriptorSet... );
vkCmdDrawIndexed(...);
// Mesh B
vkCmdBindDescriptorSets(...&meshB.descriptorSet... );
vkCmdDrawIndexed(...);
Run Code Online (Sandbox Code Playgroud)
然而,上述方法与切碎机样品和vulkan的样品有很大不同,这使得我不知道从哪里开始改变.我非常感谢任何帮助,指导我找到正确的方向.
干杯
我正在用 C++ 编写一个简单的图形引擎,它应该能够代表地球。地球被建模为一个icosphere,我计划使用每个顶点的法线来映射其纹理。为此,我本质上是尝试从顶点的法线获取垂直和水平坐标(分别为 φ 和 θ)(即纬度和经度)。
以下是实现我的方法的(已编辑的)函数(在生成新顶点时调用)。当参数是法向量时,它应该返回从(0,0)到 的纹理坐标:(1,1)n
glm::vec2 Icosphere::getTexCoord(glm::vec3 n)
{
float theta = (atan2f(n.x, n.z) / PI) / 2.f + 0.5f;
float phi = (asinf(-n.y) / (PI / 2.f)) / 2.f + 0.5f;
return glm::vec2(theta, phi);
}
Run Code Online (Sandbox Code Playgroud)
然而,这正在产生意想不到的结果。通过这个测试图像,我的 icosphere 看起来像这样:
小白色和红色三角形位于(x,y,z) = (1,0,0)。在第一张图像中,我生成了具有较少三角形面 (320) 的 icosphere,而在后者中,生成了约 82k 个三角形的 icosphere。
我怀疑导致这些纹理“故障”的原因是坐标(0,*)和(1,*)不被认为是相邻的。有没有正确的方法来做到这一点?
注意:这些是我的纹理参数:
/* Configure texture parameters: */
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); …Run Code Online (Sandbox Code Playgroud) 在决定尝试在现代OpenGL中编程之后,我已经留下了固定功能管道,我不完全确定获得与之前相同的功能.
我正在尝试使用像素完美尺寸来纹理地图四边形,匹配纹理大小.例如,128x128纹理映射到四倍128x128的大小.
这是我的顶点着色器.
#version 110
uniform float xpos;
uniform float ypos;
uniform float tw; // texture width in pixels
uniform float th; // texture height in pixels
attribute vec4 position;
varying vec2 texcoord;
void main()
{
mat4 projectionMatrix = mat4( 2.0/600.0, 0.0, 0.0, -1.0,
0.0, 2.0/800.0, 0.0, -1.0,
0.0, 0.0, -1.0, 0.0,
0.0, 0.0, 0.0, 1.0);
gl_Position = position * projectionMatrix;
texcoord = (gl_Position.xy);
}
这是我的片段着色器:
#version 110
uniform float fade_factor;
uniform sampler2D textures[1];
varying vec2 texcoord;
void main()
{ …Run Code Online (Sandbox Code Playgroud) OpenGL ES 2.0在纹理采样方面存在严重的精度问题 - 我见过类似问题的主题,但我还没有看到这个"扭曲的OpenGL ES 2.0纹理"问题的真正解决方案.
这与纹理的图像格式或OpenGL颜色缓冲区无关,似乎是精度错误.我不知道究竟是什么原因导致精度失败 - 它似乎不仅仅是导致这种失真的几何尺寸,因为简单地缩放传递给顶点着色器的顶点位置并不能解决问题.
以下是纹理失真的一些示例:
扭曲纹理(在OpenGL ES 2.0上):http://i47.tinypic.com/3322h6d.png
纹理通常是什么样的(也在OpenGL ES 2.0上):http://i49.tinypic.com/b4jc6c.png
纹理问题仅限于OpenGL ES 2.0上的小规模几何体,否则纹理采样看起来是正常的,但是颗粒效果会逐渐恶化顶点数据距离XYZ原点(0,0,0)
桌面OpenGL上不会出现这些纹理问题(在Windows XP,Windows 7和Mac OS X下正常工作)
我只看到Android,iPhone或WebGL上出现问题(类似于OpenGL ES 2.0)
所有纹理都是2的幂,但问题仍然存在
缩放顶点数据 - 顶点的XYZ位置的值在以下范围内:-65536到+65536浮点
缩放模型视图或缩放投影矩阵没有帮助
更改纹理过滤选项没有帮助
将传递给顶点着色器的纹理坐标划分,然后将它们乘以片段着色器中的正确值,也不起作用
精密highp sampler2D,highp浮动,highp INT -在片段或顶点着色器没有任何改变(lowp/mediump也不起作用)
我认为这个问题必须在某一点上得到解决 - 看到基于OpenGL ES 2.0的游戏已经能够渲染出大规模,高度详细的几何
我有一个快速问题。我想知道是否可以在 python 中执行 UV/纹理映射。我知道我可能需要导入一两个模块。但我没有太多关于如何在 python 中执行 UV/纹理映射的示例。
如果可能的话有人可以发布一个例子。最终我想要做的是导入在 3D 程序(例如 Blender 或 3D Max)中创建的 3D 模型,然后我需要将数据应用到该 3D 模型的表面。数据将采用矩阵或数组的形式。我知道 UV/纹理贴图可以帮助使这个过程变得更容易,这就是我对此感到好奇的原因。
我正在尝试在iOS上找到处理OpenGL ES2中多纹理的最有效方法."高效"我的意思是即使在较旧的iOS设备(iPhone 4及更高版本)上也能实现最快的渲染 - 而且还可以平衡便利性.
我考虑过(并尝试过)几种不同的方法.但是遇到了一些问题和疑问.
方法1 - 我的碱基值和正常值是rgb,没有ALPHA.对于这些物体,我不需要透明度.我的发射和镜面反射信息都只是一个通道.为了减少texture2D()调用,我认为我可以将发射存储为基础的alpha通道,将镜面反射存储为法线的alpha.每个都在他们自己的文件中,它看起来像这样:

到目前为止我的问题是找到一个支持完整的非预乘alpha通道的文件格式.PNG只是没有为我工作.我试图将此作为PNG保存的每一种方式都将.alpha与.rgb文件保存(通过photoshop)基本上摧毁了.rgb.当我重新加载文件时,任何具有0.0 alpha的像素都有黑色rgb.我在这里发布了这个问题没有活动.
我知道如果我能找到一种方法来保存和加载这个独立的第4通道,这种方法会产生更快的渲染.但到目前为止,我还没有能够继续前进.
方法2 - 当这不起作用时,我转到单个4向纹理,其中每个象限具有不同的地图.这不会减少texture2D()调用,但会减少着色器中正在访问的纹理数量.

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 is up and over
v_fragmentTexCoord3 = v_fragmentTexCoord0 + vec2(0.5, 0.0); // normal frag is over half
Run Code Online (Sandbox Code Playgroud)
为了避免动态纹理查找(感谢Brad Larson),我将这些偏移移动到顶点着色器并将它们保留在片段着色器之外.
但我的问题是:减少着色器中使用的纹理采样器的数量是否重要?或者我最好在这里使用4种不同的较小纹理?
我遇到的一个问题是在不同的地图之间流血.由于线性纹理映射,1.0的texcoord在一些蓝色正常像素中进行平均.这在接缝附近的物体上添加了蓝色边缘.为了避免这种情况,我不得不将我的UV贴图更改为不太靠近边缘.对很多物体来说,这是一种痛苦.
方法3是组合方法1和2.并且在一侧具有base.rgb + emission.a而在另一侧具有normal.rgb + specular.a.但我仍然有这个问题获得一个独立的alpha保存在文件中.
也许我可以将它们保存为两个文件,但在加载过程中将它们组合起来然后再发送到openGL.我得尝试一下. …
提出这个问题:我在3D渲染方面是一个完全的初学者,我想让自己的脚湿透.
我的目标是创建一个命令行脚本(理想情况下是Python),它采用某种3d模型文件(例如球体),将纹理映射到它上面,并将结果输出为图像文件.也就是说,我希望我的程序基本上能够"执行"以下操作:
从我的阅读,这似乎被称为"紫外线映射",但几乎所有我在这个主题上找到的关于如何使用Blender这样做的事情,我宁愿避免这种情况:在2d类比中,似乎我认为Blender就像Photoshop,我正在寻找像ImageMagick这样的东西.除此之外,我找不到多少.
我发现的最接近的是另一个stackoverflow问题: uv映射在低分辨率上工作不好(警告:很多图像)
但我不太清楚那里发生了什么,因为它根本不会导入三维模型 - 我的[也许是错误的]了解EXR是一种二维图像格式.
任何有关如何入门的指导将不胜感激!
我创建了一个bufferGeometry,它由5个平面组成,(100x25)每个平面带有两个三角形。
function createGeometry() {
var geometry = new THREE.PlaneGeometry(100, 25, 1);
return geometry;
}
function createScene() {
var bufferGeometry = new THREE.BufferGeometry();
var radius = 125;
var count = 5;
var positions = [];
var normals = [];
var colors = [];
var vector = new THREE.Vector3();
var color = new THREE.Color( 0xffffff );
var heartGeometry = createGeometry();
var geometry = new THREE.Geometry();
var step = 0;
for ( var i = 1, l = count; …Run Code Online (Sandbox Code Playgroud) texture-mapping ×10
3d ×2
ios ×2
opengl ×2
python ×2
shader ×2
bitmap-fonts ×1
c# ×1
c++ ×1
distortion ×1
glsl ×1
iphone ×1
javascript ×1
math ×1
objective-c ×1
plane ×1
render ×1
rendering ×1
sprite-kit ×1
texture2d ×1
textures ×1
three.js ×1
uv-mapping ×1
vulkan ×1
xcode ×1