我在3D空间中有点和它们相应的2D图像点.如何从3D点中制作网格,然后纹理网格形成的三角形面?
我一直在尝试使用方形纹理渲染GL_QUAD(形状为梯形).我想尝试使用OpenGL来解决这个问题.现在纹理变得严重扭曲,这真的很烦人.
通常情况下,我会加载纹理计算单应性,但这意味着大量的工作和额外的线性编程库/直接线性变换函数.我的印象是OpenGL可以为我简化这个过程.
我环顾网络,看过"透视 - 正确纹理,Q坐标和GLSL"和"OpenGL中的倾斜/剪切纹理映射".
这些似乎都假设你会做某种类型的单应性计算或使用OpenGL的某些部分我不知道......任何建议?
更新:
我一直在阅读"使用图像空间简化和变形导航静态环境" [ PDF ] - 第9页附录A.
看起来他们通过将(s,t,r,q)纹理坐标与模型的世界空间z分量的顶点相乘来禁用透视校正.
因此对于给定形状为梯形的四边形的给定纹理坐标(s,r,t,q),其中4个分量是:
(0.0f, 0.0f, 0.0f, 1.0f),
(0.0f, 1.0f, 0.0f, 1.0f),
(1.0f, 1.0f, 0.0f, 1.0f),
(1.0f, 0.0f, 0.0f, 1.0f)
Run Code Online (Sandbox Code Playgroud)
这和glTexCoord4f(s vert.z,r vert.z,t,q*vert.z)一样简单吗?或者我错过了一些步骤?喜欢弄乱GL_TEXTURE glMatrixMode?
更新#2:
这就是诀窍!记住这一点,这个问题遍布整个网络,并没有任何简单的答案.大多数涉及直接重新计算纹理与原始形状和变换形状之间的单应性...也就是大量的线性代数和外部BLAS lib依赖.
更新5
创建了另一个小提琴以显示预期的外观。添加了不可见的穹顶和魔方相机,并使用了环境贴图;就我而言,由于已经提到的原因,不应使用这些技术。
var MatcapTransformer = function(uvs, face) {
for (var i = uvs.length; i-- > 0;) {
uvs[i].x = face.vertexNormals[i].x * 0.5 + 0.5;
uvs[i].y = face.vertexNormals[i].y * 0.5 + 0.5;
}
};
var TransformUv = function(geometry, xformer) {
// The first argument is also used as an array in the recursive calls
// as there's no method overloading in javascript; and so is the callback.
var a = arguments[0],
callback = arguments[1];
var faceIterator = function(uvFaces, index) {
xformer(uvFaces[index], …Run Code Online (Sandbox Code Playgroud)我试图将我的纹理映射到在opengl es 2.0中制作的正方形,当我这样做时,纹理上下颠倒,我的映射是错误的吗?还是我画的方式?这是一张它的样子:

这是我的onDrawFrame代码()
public void onDrawFrame(GL10 glUnused) {
GLES20.glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
GLES20.glUseProgram(mProgram);
GLES20.glEnable(GLES20.GL_BLEND);
GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE_MINUS_SRC_ALPHA);
GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureID);
mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET);
GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT,
false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET);
GLES20.glEnableVertexAttribArray(maPositionHandle);
GLES20.glVertexAttribPointer(maTextureHandle, 2, GLES20.GL_FLOAT,
false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
GLES20.glEnableVertexAttribArray(maTextureHandle);
Matrix.orthoM(mProjMatrix, 0, 0, 200, 0, 100, -5, 5);
GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mProjMatrix, 0);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, drawOrder.length,
GLES20.GL_UNSIGNED_SHORT, drawListBuffer);
}
Run Code Online (Sandbox Code Playgroud)
方形和映射UV的协调是:
private final float[] mTriangleVerticesData = {
// X, Y, Z, U, V
0f, 0f, 0, 0.0f, 0.0f,
50f, 0f, 0, 1.0f, 0.0f, …Run Code Online (Sandbox Code Playgroud) 当我将数组绑定到CUDA中的纹理时,
如果答案是1.,那么我可以从纹理存储空间绑定纹理和安全获取数据,同时将结果写入数组,该数组在全局存储器中分配.
如果答案是2.那么纹理存储器是一个全局存储空间,数据被缓存并空间获取?
我想知道这个话题,因为我已经看到了一些与这个话题相关的问题,我现在还没有明确答案.
提前致谢.
ES 2.0新手在这里.我目前正在尝试使用ES 2.0和PowerVR SDK从立体图像制作一些3D隔行扫描图像.我可以输出一个图像纹理很好,但当我尝试输出第二个时,我似乎覆盖了第一个.所以,我的问题是,鉴于下面的片段着色器,我可以用它来绘制两个纹理,或者sampler2d均匀只能绑定到一个纹理单元吗?这是片段着色器(取自PowerVR"培训课程"示例程序):
uniform sampler2D sampler2d;\
varying mediump vec2 myTexCoord;\
void main (void)\
{\
gl_FragColor = texture2D(sampler2d,myTexCoord);\
}";
Run Code Online (Sandbox Code Playgroud)
这是我如何将图像纹理加载到着色器中:
//LEFT IMAGE
glActiveTexture(GL_TEXTURE0);
glGenTextures(1, &m_uiTexture_left);
glBindTexture(GL_TEXTURE_2D, m_uiTexture_left);
glUniform1i(glGetUniformLocation(m_uiProgramObject, "sampler2d"), 0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, pwr2Width, pwr2Height,0, GL_RGB, GL_UNSIGNED_BYTE, xImageL);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
GLfloat afVertices[30] = {0.0};
genVertices(afVertices);
glGenBuffers(1, &m_ui32Vbo_leftimage);
m_ui32VertexStride = 5 * sizeof(GLfloat); // 3 floats for the pos, 2 for the UVs
glBindBuffer(GL_ARRAY_BUFFER, m_ui32Vbo_leftimage);
glBufferData(GL_ARRAY_BUFFER, 6 * m_ui32VertexStride, afVertices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
//RIGHT IMAGE
glActiveTexture(GL_TEXTURE1);
glGenTextures(1, …Run Code Online (Sandbox Code Playgroud) 我正在使用OpenGL ES 2.0开发一个图像变形iOS应用程序.
我对设置,管道等有很好的把握,现在我正在进行数学运算.
由于我的图像变形经验是零,我正在寻求一些算法建议.
目前,我正在以网格类型的方式设置点的初始顶点,将图像均等地划分为正方形.然后,我在每个正方形的中间放置一个额外的顶点.当我绘制索引时,每个方块包含四个形状为X的三角形.请参见下图:

在玩了一点photoshop之后,我注意到adobe使用了一个稍微复杂的算法来实现他们的木偶扭曲,但是他们的标准扭曲算法更为简化.您觉得在这里申请/个人偏好最适合我?
其次,当我移动一个顶点时,我想对所有其他顶点应用加权变换以平滑边缘(而不是我在下面的内容,其中只有选定的顶点被转换).我应该在这里申请什么样的算法?

image-processing texture-mapping graph-algorithm ios opengl-es-2.0
我正在试图找出如何在对象上进行环境映射.这是设置:

我如何让茶壶的表面反映周围的环境?所以我的意思是,不是茶壶是灰色阴影,它的表面应该反映它的环境,所以它应该将棋盘映射到它的表面.
这是我想要完成的一个例子,但它使用Three.js并且我想自己做这个(这是为了一个类).
http://aerotwist.com/tutorials/create-your-own-environment-maps/demo/
这有意义吗?我该如何开始?
完成我的家庭作业后,我回答了这个问题:https://stackoverflow.com/a/10093646/196921.请参阅答案以获取链接和代码:)
在我之前的问题中,已经确定,当对四边形进行纹理化时,将面分解为三角形并且以仿射方式内插纹理坐标.
不幸的是,我不知道如何解决这个问题.该提供的链接是有用的,但它并没有得到预期的效果.作者得出结论:"请注意,图像看起来好像是一个延伸到距离的长矩形四边形......它可能变得非常混乱......因为它会产生"虚假的深度感知".
我想做的是让纹理保留纹理的原始缩放.例如,在梯形情况下,我希望纹素的垂直间距相同(使用绘图程序创建的示例):

请注意,由于垂直间距相同,但四边形明显失真,纹理空间中的直线不再是世界空间中的直线.因此,我认为所需的映射是非线性的.
问题是:这在固定功能管道中是否可能?对于更普通的四边形,我甚至不确定"正确的答案"究竟是什么.我想插值函数可以非常快速地变得非常复杂,我意识到"保留原始缩放"并不是一个算法.世界空间三角形在纹理空间中不再是线性的.
顺便说一句,我并不真正了解3 次和4 次纹理坐标; 如果有人能指出我的资源,这将是伟大的.
我在SceneKit中应用于球体的纹理中出现了间歇性的接缝外观.它始终位于球体的"后面",纹理的两个边缘相遇.看起来纹理与自身并不完全连接,您可以通过细线看到背景.问题似乎存在于所有设备和所有最近的iOS版本中.我的实验表明,纹理的分辨率似乎是一个因素,但我还没有确切地确定了这种影响.
为了清晰起见,我附上了一个截图来说明白色背景,但是接缝本身并不是白色,它只是让背景显示出来:
有谁知道为什么SceneKit会以这种方式渲染纹理?我有一个相当简单的实现,只是创建一个球体和一个材料,并应用漫反射和法线贴图.这是我的代码:
// create planet
SCNNode *baseNode = [SCNNode node];
[baseNode setName:name];
// Planet
SCNSphere *planet = [SCNSphere sphereWithRadius:5];
SCNNode *planetNode = [SCNNode nodeWithGeometry:planet];
[planetNode setName:@"planetNode"];
[baseNode addChildNode:planetNode];
SCNMaterial *material = [SCNMaterial material];
material.shininess = 1;
material.normal.intensity = 0.5;
material.normal.contents = normalMap;
material.diffuse.contents = diffuseMap;
planetNode.geometry.materials = @[material];
Run Code Online (Sandbox Code Playgroud)
有没有人有任何可能导致这种"缝"出现的经验,以及我如何摆脱它?我的纹理通常是1000x500或2048x1024,具体取决于具体情况,并且两种分辨率都出现了接缝.是否有一个理想的SceneKit纹理分辨率,或众所周知的可能导致此行为的东西?