为什么我的OpenGL场景在Z轴距离为1时出现了剪切?
我正在通过GLSL食谱工作,但是我正在使用C#编程,因此我正在尝试使用Opentk转换代码. 我目前正在使用一个phong阴影示例,并且可以使照明的机制正常工作,但是我使用的圆环模型不会呈现出任何元素,而元素距离Z-距离超过相机1之外. 这是正确渲染的示例(x旋转= 0,y旋转= 0,camera.z = 1,model.z = 0) torus正确地渲染 在这里使用X和Y旋转(X旋转= -0.5,y旋转= 0.5,Camera.Z = 1,Model.Z = 0) 旋转曲线显示剪裁 注意:如果在旋转的示例中,我将摄像机 CLOSE 移至0.4的Z位,则圆环出现而不会剪切.我不知道为什么将摄像机移到较近的情况下会导致剪辑较少! 有很多代码,因此我会尽量避免发布所有代码.如果我确实需要再发布,那么我很乐意这样做. 这是我的初始化块: void InitProgram() { // Compile and link shaders Comp
14 2024-04-24
编程技术问答社区
我试图在opentk中实现索引缓冲器对象,但不知道在绘制东西时如何真正使用它。
我正在尝试使用索引缓冲区,但不知道 我真的被困在墙上,因为我应该尝试的事情. 这些教程都没有真正显示与我的代码相似的东西,这主要是为什么我遇到问题的原因.我可能必须重写Cube顶点阵列创建者. (在另外,也许我不应该只是将OpenGL推入一些准备就绪代码)现在,我只启用了顶部的面孔才能看到发生了什么. /// /// Draws the specified Cube Onsccreen. /// public void Draw() { GL.UseProgram(VSID); Vector3 ObjectPosition = new Vector3((new Vector(1, 1) * (Position - Offset))) { Z = Layer * 0.1f }; Matrix4 Scale = Matrix4.CreateScale(Width + highligh
12 2024-04-22
编程技术问答社区
如何使用 WebGL 和一个顶点着色器绘制多条 Bézier 曲线?
我想实现一个能够通过仅使用一个顶点着色器在画布上显示多个立方体bézier曲线的WebGL程序.我希望此着色器在每个曲线上计算给定数量的点,并重复每个曲线的过程. 说要绘制的立方贝齐曲线的数量为N. 由4个控制点定义的立方体bézier曲线,我将拥有N * 4控制点以给出顶点着色器. 说每个曲线要计算的点数为precision. 我计算曲线上包含precision插值值的列表ts(从0到1). 说precision是6,我最终会得到以下ts列表:[0, 0.2, 0.4, 0.6, 0.8, 1]. 使用这两个缓冲区(N * 4控制点的列表和ts列表),我希望Pertex着色器并行计算每个N曲线的所有插值点. . so对于ts中的每个t,每个curve,我想计算点curve(t)的位置,其中: curve(t) = (1 - t)³ * p0 + 3 * (1 - t)² * t * p1 + 3 * (1 - t) * t² * p2 + t
10 2024-04-22
编程技术问答社区
如何使用 GL_TEXTURE_2D_ARRAY 绑定多个纹理(作为数组)?
根据此答案: openggl sampler2d array 您不能使用片段着色器输入变量来索引纹理采样器数组.您必须使用sampler2darray(GL_TEXTURE_2D_ARRAY),而不是一个sampler2d(GL_TEXTURE_2D) 的数组 所以我试图做到这一点 - 生成GL_TEXTURE_2D_ARRAY: #include #include #include #define STB_IMAGE_IMPLEMENTATION #include #include uint32_t LoadTexture(const std::string& filepath) { int w, h, bits; stbi_set_flip_vertically_on_load(1
18 2024-04-22
编程技术问答社区
将带有缓冲区的着色器程序从 shadertoy 移植到 three.js 中
我最近正在尝试和学习WebGL和着色器,因为我正在尝试为网站背景构建动画.我能够将简单的示例从Shadertoy转移到三分.现在,我试图更好地理解更高级的例子,并且在这个特别的示例中挣扎: https://www.shadertoy.com/view/4sfbwj 我知道,到port Shader程序到三. 使用new THREE.PlaneGeometry() 创建Thrix.js Basic Setup 为iTime和iResolution 创建制服 创建顶点和片段着色器脚本标签 带有Shadertoy内容的填充片段着色器(图像部分) 带有通用脚本的填充顶点着色器 将名称更改为gl_FragColor和gl_FragCoord 将功能的名称更改为void main(void) 如果一个或多个通道中使用了一些纹理,则 用new THREE.TextureLoader()加载纹理,并为iChannel0 创建统一 基本示例将是很好的选择.但是我链
24 2024-04-22
编程技术问答社区
Three.js-将平面缩放到全屏
我在这样的场景中添加了一架飞机: // Camera this.three.camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 0.1, 60); // Plane const planeGeometry = new THREE.PlaneBufferGeometry(1,1,this.options.planeSegments,this.options.planeSegments); const planeMat = new THREE.ShaderMaterial( ... ) this.three.plane = new THREE.Mesh(planeGeometry,planeMat); this.three.scene.add(this.three.plane); 非常基本.我比试图找出如何在Z轴上移动飞机以填充浏览器视频.为此, // See attac
16 2024-04-22
编程技术问答社区
使用 gl_FragColor 与 out vec4 颜色?
似乎对gl_FragColor被弃用有很多歧义.例如,它在 glsl 4.60规范中. 最安全,最兼容,最受支持的策略是什么?使用gl_FragColor或定义着着色器输出,例如out vec4 color? 解决方案 是,gl_FragColor被弃用.您应该使用以下语法: layout(location = 0) out vec4 diffuseColor; 它包含在7.1.7. Compatibility Profile Built-In Language Variables节下的GLSL 4.60规格中.这意味着,如果您创建了核心上下文,则该变量将不可用. 其他解决方案 如果您将阅读小心地,您会在第" 7.1.1兼容性配置文件内置语言变量" 中找到gl_FragCoord,就像 使用兼容性配置文件: 时,以下片段输出变量可在片段着色器中可用. out vec4 gl_FragColor; out vec4 gl_FragData[gl_M
20 2024-04-22
编程技术问答社区
如何使用 WebGL 和 GLSL 在 J/s 文件中运行 Shadertoy 的着色器?
我是编程着着色器的新手,我想用WebGL和GLSL创建一个着色器.为了了解它的真正工作方式,我想从Shadertoy测试着着色器.但是,如何从Shadertoy中获取代码并实际上可以在J/S文件中运行它?您是否只需要将代码从Shadertoy复制到片段着色器中,还是什么? 解决方案 请参见以下非常基本的示例.您可以将 shadertoy 代码放在mainImage函数中,在片段着色器中: (function loadscene() { var canvas, gl, vp_size, prog, bufObj = {}, mousepos = [0, 0]; function initScene() { canvas = document.getElementById( "ogl-canvas"); gl = canvas.getContext( "experimental-webgl" ); if ( !gl ) retu
20 2024-04-22
编程技术问答社区
SFML 2.5.1-不支持几何着色器,Ubuntu 22.04,NVIDIA GeForce RTX Mobile
更改操作系统后,我再也无法使用SFML几何着色器,并且总是会有以下错误: Failed to create a shader: your system doesn't support geometry shaders (you should test Shader::isGeometryAvailable() before trying to use geometry shader 奇怪的是,isAvailable()函数检查系统是否支持着色器,返回true,并让我认为我的系统确实不支持几何形状着色器. 尽管我知道我的系统支持这种着色器.为了证明这一点,可以键入命令glxinfo并搜索某种几何着色器.如果未识别命令,则可以安装它: $ sudo apt-get install mesa-utils 最后,当我抓住"几何"之类的信息时,我会得到以下输出. $ glxinfo | grep geometry GL_EXT_float_blend, GL_EX
22 2024-04-22
编程技术问答社区
正确使用GLTexImage3D的问题
这就是我将位图提供给OpenGL的方式. (C#) public static int Generate3DTexture( string[] names ) // file paths { //basically merging the images into one vertical column of images MagickImageCollection allimages = new MagickImageCollection(); foreach (string eachname in names) allimages.Add(new MagickImage(eachname)); MagickImage template = new MagickImage(MagickColor.FromRgba(0, 0, 0, 0), MasterSize.Width, MasterSize.Height * names.Leng
8 2024-04-22
编程技术问答社区
通过比较另一个图像的强度来改变一个图像的强度-OpenTK
我有两个图像.我必须找到强度大于0.8的第一个图像的点.同时,我必须在同一点上找到第二张图像的强度,并且需要在相同点上以阈值/滑块值(范围为0到1)调整第二图像的光.我已经像以下那样做了.在点上获得黑色或黑暗区域的强度大于0.8. 我正在尝试使用HSV的Z值. 但是,我应该能够调整Image2上的光.我该如何实现? public void CreateShaders() { /***********Vert Shader********************/ vertShader = GL.CreateShader(ShaderType.VertexShader); GL.ShaderSource(vertShader, @" attribute vec3 a_position; varying vec2 vTexCoordIn; void main() { vTexCoordI
10 2024-04-22
编程技术问答社区
并排显示图像的一半部分-OpenGL
我为两个图像创建了两个纹理.现在,我想按OpenGL以image2,完整image1(image2的右侧)的一部分的顺序显示这种纹理.我已经像以下那样做了. Image1在OpenGL屏幕的中心显示.但是屏幕的左右一部分是不正确的(应分别显示Image2的左侧部分和Image2的右侧) 顶点着色器: attribute vec3 a_position; varying vec2 vTexCoord; void main() { vTexCoord = (a_position.xy + 1) / 2; gl_Position = vec4(a_position,1); } 片段着色器: precision highp float; uniform sampler2D sTexture;//texture for image 1 uniform sampler2D sTexture1;//texture for image 2 varying vec2
8 2024-04-22
编程技术问答社区
简单的OpenTK着色器不工作
我目前正在尝试使用OpenGl superbible和我尝试转换" 我的结果只是颜色缓冲,但否则一个空窗口,我根本不明白我在哪里犯了一个错误,因此在查找和更重要的理解方面的任何帮助都将不胜感激. 我的Opentk代码: using System; using System.Drawing; using System.Drawing.Imaging; using System.IO; using OpenTK; using OpenTK.Graphics.OpenGL; using OpenTK.Input; namespace learnopengl.HelloTriangle { public class MainWindow : GameWindow { int _shaderId; int _vao; int _glbuf; int _fragObj; int _verte
14 2024-04-19
编程技术问答社区
OpenGL 4.2的LookAt矩阵只在眼睛位置有-z值的情况下工作。
我试图理解和应用现代的OpenGL矩阵转换.我已经阅读了很多不同的资源,但我不确定我实际上在做什么. 我所遇到的问题也在代码中评论:如果我将MATRIX4的眼坐标设置为Z值,则不再可见一个或等于0或更低-2,则三角形不再可见. . 有人可以解释为什么吗?据我了解,三角形应该仅在另一侧看到三角形(明确禁用脸部剥落不会改变任何东西). 另一件事很奇怪:如果我旋转三角形,如果我使用eye -z = -2,它似乎会被夹住.如果我使用-1,它看起来"更顺畅".有什么想法吗? 这是完整的程序: using System; using OpenTK; using OpenTK.Graphics; using OpenTK.Graphics.OpenGL4; namespace OGL420_Matrices { // OpenTK version 3.1.0 internal class Program { public sta
12 2024-04-13
编程技术问答社区
如何投影OpenGL控件的顶部和底部区域(圆柱形投影)?
使用以下代码我可以在OpenGL控件中显示图像.处于矩形形状.现在,我想将该矩形的顶部和底部区域投影到圆柱形的形状.我的意思是需要在OpenGL上进行矩形至圆柱体投影.我该如何实现? private void CreateShaders() { /***********Vert Shader********************/ vertShader = GL.CreateShader(ShaderType.VertexShader); GL.ShaderSource(vertShader, @"attribute vec3 a_position; varying vec2 vTexCoord; void main() { vTexCoord = (a_positi
8 2024-04-11
编程技术问答社区
平面测量法变成了一个领域
我觉得我的逻辑在这里不太糟糕.我试图使用其紫外线坐标作为纬度和经度,将平面测定法转换为球体.本质上是逻辑: 将UV坐标分别转换为LAT/长 将lat/long更改为弧度 转换为x,y,z catesian坐标 引起了顶点着色器的代码: varying vec2 vUv; #define PI 3.14159265359 void main() { vUv = uv; float lat = (uv.x - 0.5) * 90.0; float lon = abs((uv.y - 0.5) * 180.0); float latRad = lat * (PI / 180.0); float lonRad = lon * (PI / 180.0); float x = sin(latRad) * sin(lonRad); float y = cos(la
20 2024-04-10
编程技术问答社区
OpenGL-三角形没有生成颜色和顶点的动态阵列
#include #include #include #include #include #include #include // Vertex Shader source code const char* vertexShaderSource = R"( #version 330 core layout(location = 0) in vec3 inPosition; // Vertex positions layout(location = 1) in vec3 inColor; // Vertex colors out vec3 fragColor; // Output color to the fragment shader void main() { gl
14 2024-04-09
编程技术问答社区
在GLSL中从数组初始化结构
假设我在着色器中有一个数组变量,在着色器存储块中声明: layout(std430, binding = 2) buffer MyBuffer { float lotsOfFloats[]; }; 和一个结构: struct myStruct { float f1; vec3 vf1; }struct1; 是否有一种方法可以使用缓冲区存储块中的数组中的数组中的值快速初始化此结构的对象(在此示例中的LotsOffloats数组中)?说,在C ++中,可以将内存从数组复制到对象: memcpy(&struct1, &lotsOfFloats[0], sizeof(myStruct) ); 或一个可以通过分配的字节复制数组值: struct1 = *(myStruct*)&lotsOfFloats[0]; GLSL中是否有类似的方式?例如.将在GLSL中使用第二种方式(字节复制分配)? 解决方案 而不是将您的SSB视为非结构化的浮子数组,
28 2024-04-09
编程技术问答社区
如何正确制作阴影贴图的深度cubemap?
我已经编写了代码将我的场景对象渲染到格式的cubemap纹理GL_DEPTH_COMPONENT,然后在着色器中使用此纹理来确定是否直接点亮片段,以进行阴影目的.但是,我的cubemap似乎是黑色的.我想我没有充分设置我的FBO或渲染上下文,但看不到缺少的内容. 在兼容性配置文件中使用GL 3.3. 这是我创建FBO和CUBEMAP纹理的代码: glGenFramebuffers(1, &fboShadow); glGenTextures(1, &texShadow); glBindTexture(GL_TEXTURE_CUBE_MAP, texShadow); for (int sideId = 0; sideId
12 2024-04-08
编程技术问答社区