Questions tagged «opengl»

OpenGL是针对台式机和工作站市场的图形标准和API。它的设计易于通过专用计算机硬件进行加速,因此与传统的软件渲染相比,大多数实现方式都可以大大提高性能。当前,OpenGL用于CAD软件和计算机游戏等应用程序。它也是跨平台的。OpenGL标准由Khronos组控制,该组还控制OpenGL ES。

12
图形API之前的3D理论?[关闭]
关闭。这个问题是题外话。它当前不接受答案。 想改善这个问题吗? 更新问题,使其成为Game Development Stack Exchange 的主题。 5年前关闭。 我是一名软件工程师,我希望将自己的职业转向游戏开发。我正在使用C ++ / DirectX在2D上读书。当我进入3D时,我知道我想正确地做。例如,我对3d空间一无所知。因此,如果我仅学习API,我可能会知道,但是我不知道是否可以使用它开发交互式的mini 3d世界。我不会拥有一个带有最新着色器等的旋转板条箱来称自己为成功。我的数学技能取决于三角/线性代数,并且还在上大学。我知道还会有更多的数学运算。在选择OpenGL / Direct3D之前,我应该先阅读3D理论书籍还是其他建议?我只知道API不会教授3D游戏开发,也不希望之后迷路。我非常注重书籍,因此也可以提供建议。欢迎思想。谢谢!
19 graphics  c++  opengl  directx 

7
为什么浮点数的分辨率从原点开始进一步降低?
我的OpenGL场景中的对象离原点的距离非常可笑。当我查看这些对象并在它们周围平移/旋转/缩放照相机时,它们会“抖动”。也就是说,组成对象的顶点似乎围绕着虚构的3d点网格捕捉。我已经读到这是一个常见的问题,因为可以使用浮点精度(OpenGL和几乎所有其他功能使用的精度)存储大量信息。我不明白为什么会这样。 在寻找解决方案时,我遇到了非常简单的“浮动原点”修复程序,它似乎起作用了。我只是对所有物体进行了变换,所以我的对象处于相同的相对位置,但是无论照相机看着什么,它都接近原点。我在这里找到了一个解释:http : //floatingorigin.com/,但是我无法理解。 那么...有人可以解释为什么将我的场景放置在离原点很远的地方(例如1000万个单位)会导致我观察到的行为不稳定吗?还有为什么将其移到靠近原点的位置才能解决此问题?
19 c++  opengl 

6
无缝的tilemap渲染(无边界的相邻图像)
我有一个2D游戏引擎,可通过从tileset图像绘制图块来绘制图块。由于默认情况下OpenGL只能包装整个纹理(GL_REPEAT),而不仅仅是部分纹理,因此每个图块都被拆分为单独的纹理。然后,将同一图块的区域渲染为彼此相邻。这是按预期工作时的样子: 但是,一旦引入分数缩放,接缝就会出现: 为什么会这样?我以为这是由于线性过滤混合了四边形的边界,但仍然发生在点过滤中。到目前为止,我发现的唯一解决方案是确保所有定位和缩放仅在整数值处进行,并使用点过滤。这可能会降低游戏的视觉质量(尤其是子像素定位不再起作用,因此运动不太流畅)。 我尝试过/考虑过的事情: 抗锯齿可以减少但不能完全消除接缝 关闭mipmapping,无效 分别渲染每个图块并将其边缘拉伸1px-但这是一种非优化,因为它不再能够一次性渲染图块区域,并且会沿着透明区域的边缘创建其他伪像 在源图像周围添加1px边框并重复最后一个像素-但随后它们不再是2的幂,从而导致与不支持NPOT的系统的兼容性问题 编写自定义着色器以处理平铺图像-但是您将有何不同呢?GL_REPEAT应从边框的图像另一侧抓住像素,而不要选择透明度。 几何形状完全相邻,没有浮点舍入错误。 如果片段着色器经过硬编码以返回相同的颜色,则接缝消失。 如果将纹理设置为GL_CLAMP而不是GL_REPEAT,则接缝消失(尽管渲染错误)。 如果纹理设置为GL_MIRRORED_REPEAT,则接缝消失(尽管渲染还是错误的)。 如果我将背景设为红色,则接缝仍为白色。这表明它是从某个地方(而不是透明度)采样不透明的白色。 因此,接缝仅在GL_REPEAT设置时出现。仅出于某种原因,仅在此模式下,几何图形的边缘会出现渗色/泄漏/透明性。这个怎么可能?整个纹理是不透明的。


1
游戏引擎设计– Ubershader-着色器管理设计
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 2年前关闭。 我想实现一个带有延迟着色的灵活的Ubershader系统。我目前的想法是从模块中创建着色器,以处理某些功能,例如FlatTexture,BumpTexture,位移映射等。也有一些模块可以解码颜色,进行色调映射等。这具有我可以如果GPU不支持某些类型的模块,请更换它们,以便我可以适应当前的GPU功能。我不确定这种设计是否良好。我担心我现在可能会做出错误的设计选择,以后再为此付出代价。 我的问题是,在哪里可以找到有关如何有效实施着色器管理系统的资源,示例和文章?有谁知道大型游戏引擎是如何做到的?

4
如何围绕目标点旋转摄像机?
我正在绘制一个场景,其中摄影机可以在宇宙中自由移动。相机类跟踪视图(或注视)点,相机的位置以及向上矢量。然后将这些向量/点传递到gluLookAt。 平移和缩放几乎不容易实现。然而,我发现围绕转动一下点要多得多的问题。我想编写一个函数Camera.rotate,它具有2个角度,一个可以向上/向下旋转,另一个可以沿以视点为中心的假想球向左/向右旋转。 是否有捷径可寻? 我已经(简要地)阅读了有关四元数的信息,但是我想看看鉴于场景的构造相对简单,是否有更简单的解决方案。

3
为什么像素着色器不让我们直接从帧缓冲区或深度缓冲区读取?
让我在像素着色器中采样帧缓冲区或深度缓冲区将是一个非常有用的功能。即使只是能够知道当前像素背后的深度或颜色,也会很有用。 为什么OpenGL和DirectX都不允许我这样做?我原本希望存在某种硬件限制,但是Alpha混合使用帧缓冲区中的颜色进行混合计算,而Z测试会在当前位置采样深度缓冲区。为什么不直接将这些价值观展示给我们呢?我希望以后能看到吗?
18 opengl  3d  directx  shaders 

2
如何将鼠标单击转换为射线?
我有一个透视投影。当用户单击屏幕时,我想计算从鼠标点投射的近平面和远平面之间的射线,因此我可以对自己的世界进行一些射线相交的代码。 我正在使用自己的矩阵以及矢量和射线类,它们均按预期工作。 但是,当我尝试将射线转换为世界坐标时,我的远端总是以0,0,0结尾,因此射线从鼠标单击转到对象空间的中心,而不是通过对象。(near和far的x和y坐标相同,只是z坐标互为负数而不同) GLint vp[4]; glGetIntegerv(GL_VIEWPORT,vp); matrix_t mv, p; glGetFloatv(GL_MODELVIEW_MATRIX,mv.f); glGetFloatv(GL_PROJECTION_MATRIX,p.f); const matrix_t inv = (mv*p).inverse(); const float unit_x = (2.0f*((float)(x-vp[0])/(vp[2]-vp[0])))-1.0f, unit_y = 1.0f-(2.0f*((float)(y-vp[1])/(vp[3]-vp[1]))); const vec_t near(vec_t(unit_x,unit_y,-1)*inv); const vec_t far(vec_t(unit_x,unit_y,1)*inv); ray = ray_t(near,far-near); 我怎么了?(如何解开鼠标点?)

6
OpenGL线框
不,我不是在寻找glPolygonMode。我正在寻找一种方法,可能是GLSL着色器,它将生成对象的复古风格线框外观。有什么建议么? 像Vector Tanks一样。 最好,该解决方案也应在OpenGL ES 2.0上运行。 任何提示和指针(只要不为NULL)就不胜感激!
18 opengl 

1
Phong照明-镜面照明有些奇怪
我实施了Phong照明。一切似乎都可以正常工作-圆环和球体都按预期方式进行了照明,等等。但是我注意到定向光的镜面照明有些奇怪。 这是两个屏幕截图。 第一: 第二: 如您所见,当相机远离物体时,更多区域具有镜面照明。 以下是简化的顶点着色器: #version 330 core layout(location = 0) in vec3 vertexPos; layout(location = 1) in vec3 vertexNorm; layout(location = 2) in vec2 vertexUV; uniform mat4 MVP; uniform mat4 M; out vec2 fragmentUV; out vec3 fragmentNormal; out vec3 fragmentPos; void main() { fragmentUV = vertexUV; fragmentNormal = …

1
法线与法线贴图
我正在使用Assimp资产导入器(http://assimp.sourceforge.net/lib_html/index.html)来解析3d模型。 到目前为止,我已经简单地提取了为网格中每个顶点定义的法线向量。但是我还在法线贴图上找到了各种教程... 据我了解,对于法线贴图,法线矢量存储在法线贴图的每个纹理元素中,您可以将它们从着色器的法线纹理中拉出。 为什么有两种获取法线的方法,一种被认为是最佳实践,为什么呢?

1
GLSL光线(衰减,颜色和强度)公式
我正在Voxel引擎中实现点光源,我真的在努力获得良好的光流,从光源附近的100%到光半径的0%。 我对该函数有5个参数: 浅色(Vec3) 光强度(距光的距离,直到衰减为100%的距离) 光线到碎片的距离 从片段法线到光的角度 灯的位置 谁能按正确的方向推动我创建用于计算片段颜色的函数? 我的其中一项实验的图片: 编辑(字节请求当前代码)请注意,这只是我这边的一些实验代码。我从一个网站上获得了一个float att,它虽然可以正常工作,但远非完美。: void main() { // Light color vec3 torchColor = vec3(1.0f, 1.0f, 1.0f); float lightAdd = 0.0f; for (int i=0; i<5; i++) { vec3 pos = lights[i]; if (pos.x == 0.0f) continue; float dist = distance(vertex_pos, pos); if (dist < …
17 opengl  glsl  lwjgl  lighting  pixel 

2
OpenGL:我应该在哪里放置着色器?
我正在尝试学习OpenGL ES 2.0,并且想知道“管理”着色器的最常见做法是什么。 我之所以问这个问题,是因为在我发现的示例中(例如与android sdk一起提供的API Demo中包含的示例),我通常会看到GLRenderer类中的所有内容,而我希望将它们分开,这样我就可以拥有例如,一个GLImage对象,无论何时我想绘制带纹理的四边形(我现在仅专注于2D),都可以重用,就像我在OpenGL ES 1.0代码中一样。在我发现的几乎每个示例中,着色器仅定义为类属性。例如: public class Square { public final String vertexShader = "uniform mat4 uMVPMatrix;\n" + "attribute vec4 aPosition;\n" + "attribute vec4 aColor;\n" + "varying vec4 vColor;\n" + "void main() {\n" + " gl_Position = uMVPMatrix * aPosition;\n" + " vColor = aColor;\n" + "}\n"; …

1
GLSL,全部包含在一个或多个着色器程序中?
我正在使用OpenGL进行一些3D演示,我注意到GLSL有点“受限”(或者仅仅是我吗?)。无论如何,我有许多不同类型的材料。某些材质具有环境和漫反射颜色,某些材质具有环境光遮挡贴图,某些材质具有镜面贴图和凹凸贴图等。 是最好在一对顶点/片段着色器对中支持所有对象,还是更好地创建许多顶点/片段着色器并根据当前选择的材质进行选择?OpenGL或D3D中通常的着色器策略是什么?
17 opengl  3d  shaders  glsl 

2
如何在OpenGL中模拟有限的(256)调色板?
在Twitter上,我找到了正在开发的游戏的以下屏幕截图: 顶部的图像似乎没有任何颜色限制。但底部的其他两张图片则具有256色调色板。 我想达到类似的效果我的比赛(我使用OpenGL)。我该怎么办?
16 opengl  webgl 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.