在OpenGL着色语言(GLSL)中讨论凹凸贴图,镜面高光和这些东西
我有:
现在,我如何计算每个顶点的Binormal和Tangent?我的意思是,计算Binormals的公式是什么,我必须根据这些信息使用什么?和切线相关?
无论如何我都会构建TBN矩阵,所以如果你知道根据这些信息直接构造矩阵的公式会很好!
哦,是的,如果需要,我也有纹理坐标.正如我所说的GLSL,我认为,每个顶点解决方案都是不错的,它不需要一次访问多个顶点信息.
----更新-----
我找到了这个解决方案
vec3 tangent;
vec3 binormal;
vec3 c1 = cross(a_normal, vec3(0.0, 0.0, 1.0));
vec3 c2 = cross(a_normal, vec3(0.0, 1.0, 0.0));
if (length(c1)>length(c2))
{
tangent = c1;
}
else
{
tangent = c2;
}
tangent = normalize(tangent);
binormal = cross(v_nglNormal, tangent);
binormal = normalize(binormal);
但我不知道它是否100%正确.
我对这一点感到困惑.
我在书籍,博客,论坛甚至OpenGl规范中发现的一切都只是谈论一种非常抽象的技术.没有关于现实世界的例子.
我对此感到疯狂:如何使用OpenGL ES 2.x放置和管理多个对象(网格)?
理论上似乎很简单.你有一个顶点着色器(vsh)和片段着色器(fsh),然后你将两者绑定到一个程序(glGenProgram,glUseProgram,...).在每个渲染周期中,该程序将通过每个顶点执行其VSH,然后在该3d对象的每个"像素"上执行FSH,最后将最终结果发送到缓冲区(显然没有谈论每个顶点,光栅化和管道中的其他步骤).
好的,看起来很简单......
所有这些都是通过调用draw函数(glDrawArrays或glDrawElements)来解决的.
再好吧.
现在事情让我很困惑.如果你有几个要渲染的对象?
我们来谈谈一个现实世界的例子.想象一下,你有一个树木和一个角色的风景.景观的草有一个纹理,树有纹理到树干和树叶(纹理图集),最后字符有另一个纹理(纹理图集),也是动画.
想象一下这个场景后,我的问题很简单:你如何组织这个?
您是否为场景中的每个元素创建了一个单独的程序(带有一个VSH和FSH)?就像草地和土壤的救济计划一样,树木计划和角色计划?
我已经尝试过了,但是......当我创建多个程序并尝试使用glVertexAttribPointer()时,对象的纹理和颜色会相互冲突.因为第一个程序的属性,索引的位置在第二个程序中重复.
让我解释一下,我在一个控制场景底层的类中使用了glGetAttribLocation(),因此OpenGL核心为我返回了顶点属性的索引0,1和2.之后,在树类中我创建了另一个程序,其他的着色器,并且在此次使用glGetAttribLocation()之后,OpenGL核心返回索引为0,1,2和3.
在渲染周期之后,我开始用glUseProgram()设置第一个程序,并且我用glVertexAttribPointer()更改了它的顶点属性,最后调用了glDrawElements().在此之后,再次调用glUseProgram()到第二个程序并再次使用glVertexAttribPointer(),最后再使用glDrawElements().但是在这一点上,事物进入冲突,因为第二个程序的顶点属性索引也会影响第一个程序的顶点.
我尝试了很多东西,搜索了很多,问了很多......我很累.我找不到有什么不对.
所以我开始认为我做错了!
现在我再次重复我的问题:如何使用OpenGL ES 2.x中的多个网格(具有不同的纹理和行为)?使用多个程序?怎么样?
有办法在C中获取数据类型吗?
例如:
int foo;
if (foo is int)
{
// do something
}
或类似的东西:
if (typeof(foo) == typeof(int))
{
// do something
}
提前致谢.
简单的问题:
是否总是更好地在Vertex Shader中进行硬计算,而不是在Fragment Shader中进行?即使是高网格模型,也有超过100.000个多边形(假设有一堆独特的顶点)?
我的mod_rewrite代码是:
Options +FollowSymLinks
Options +Indexes
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)?$ index.php?url=$1 [L,NC]
Run Code Online (Sandbox Code Playgroud)
此结构放在我的服务器路径上 /beta
当我放置URL时,http://mydomain.com/beta/download一切都可以重写到真实路径http://mydomain.com/beta/index.php?url=download
问题发生在相对路径上.当我输入URL时http://mydomain.com/beta/download/box,重写转到http://mydomain.com/beta/index.php?url=download/box...但....
我所有的相对路径,像我的css文件夹,我的js文件,图像文件....一切都在我的index.php页面崩溃的相对路径的辩论,因为我的相对路径变download/css,download/js,download/images...等...
我知道这个问题是由于路径"download /"中的斜线而发生的,但我如何使用.htaccess中的mod_rewrite解决这个问题?
我可以阻止相对路径中的重写吗?甚至在我自己的域的内部路径?
如何在不改变绝对路径的相对路径的情况下解决这个问题?
谢谢
opengl ×2
shader ×2
3d ×1
apache ×1
c ×1
glsl ×1
math ×1
mod-rewrite ×1
objective-c ×1
opengl-es ×1
performance ×1
php ×1
types ×1