C#有免费的OpenGL支持库吗?如果是这样,我使用哪一个,在哪里可以找到样本项目?
C#是否为OpenGL提供类?
我是OpenGL和图形编程的新手.到目前为止,我一直在读一本非常详尽且写得很好的教科书.但是,我在代码中找到了一点,我不太了解,我想在我之前理解这些线条.继续.
GLuint abuffer;
glGenVertexArrays(1, &abuffer);
glBindVertexArray(abuffer);
Run Code Online (Sandbox Code Playgroud)
GLuint buffer;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);
Run Code Online (Sandbox Code Playgroud)
该书解释说,前三行是创建一个顶点数组对象,用于将关联数据与顶点数组捆绑在一起.第二行找到一个未使用的名称(我猜测存储的无符号整数标识符abuffer),第三行创建对象/使其处于活动状态.
这本书解释了第4到第7行创建一个缓冲对象来存储我们的数据,第5行给我们一个未使用的标识符(类似于第2行的顶点数组对象?),第6行创建缓冲区,第7行line在CPU上分配足够的内存并创建指向我们的数据(点)的指针GL_STATIC_DRAW.
对象处于活动状态意味着什么?你abuffer什么时候会用?顶点数组捆绑关联数据是什么意思,以及与此顶点数组对象关联的数据何时?
我对abuffer和之间的关系感到困惑buffer.我对顶点数组与缓冲区对象的关系以及该关系形成的关系感到困惑.我不确定它们是否实际上是相关的,但是它们在教科书中一个接一个地出现.
任何帮助,将不胜感激.谢谢.
我听说GL_QUADS将在OpenGL版本> 3.0中删除,为什么会这样?我的旧程序将来不会有用吗?我已经进行了基准测试,GL_TRIANGLES或者GL_QUADS在渲染速度方面没有差异(甚至可能GL_QUADS更快).那么重点是什么?
我试图通过从它的实例借用一个可变引用来操纵x结构的字段。Foofoo
如果我尝试在原始实例移动后x使用y实例的移动绑定打印字段,它会继续打印未更改的值。foo
下面的简化示例:
struct Foo {
x: i32,
}
fn main() {
let mut foo = Foo { x: 42 };
let x = &mut foo.x;
*x = 13;
let y = foo;
println!("{}", y.x); // -> 42; expected result: 13
}
Run Code Online (Sandbox Code Playgroud)
相反,如果我打印移动的绑定y本身,它会打印更改后的值。
println!("{:?}", y); // -> Foo { x: 13 }
Run Code Online (Sandbox Code Playgroud)
或者,如果我在移动之前x或foo.x 之前打印其他内容,它会按预期打印内容。
println!("{}", x); // -> 13
let y = foo; …Run Code Online (Sandbox Code Playgroud) 我有一个关于如何设置纹理的问题glUniform1i.我见过如下代码.
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture0);
glUniform1i(_textureUniform, 0);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture1);
glUniform1i(_textureUniform, 1);
Run Code Online (Sandbox Code Playgroud)
这是否意味着,如果我使用的数量i在glUniform1i的话,我必须使用glActiveTexture(GL_TEXTURE **i** )?
我需要一个多边形的例子,只能通过triangle_strip和另一个只能通过triangle_fan完成的多边形来完成.
我在C++类中有一个OpenGL对象.由于我正在使用RAII,我想让析构函数删除它.所以我的班级看起来像:
class BufferObject
{
private:
GLuint buff_;
public:
BufferObject()
{
glGenBuffers(1, &buff_);
}
~BufferObject()
{
glDeleteBuffers(1, &buff_);
}
//Other members.
};
Run Code Online (Sandbox Code Playgroud)
这看起来很有效.但是当我执行以下任何操作时,我在使用它时会开始出现各种OpenGL错误:
vector<BufferObject> bufVec;
{
BufferObject some_buffer;
//Initialize some_buffer;
bufVec.push_back(some_buffer);
}
bufVec.back(); //buffer doesn't work.
BufferObject InitBuffer()
{
BufferObject buff;
//Do stuff with `buff`
return buff;
}
auto buff = InitBuffer(); //Returned buffer doesn't work.
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?
注意:这是尝试建立这些问题的规范答案.
所以基本上我已经使用OpenGL创建了一个可以执行3D Ray Picking的程序.如果Camera View Direction Ray触摸/交叉任何东西(不是空气),那么将在交叉点/点处渲染一个小的紫色框.
如果光线与任何"红色框"相交,那么与光线相交的光线将变为绿色.地面和墙壁根本不会改变颜色或纹理.
例子:
我目前进行3D射线拾取的方法是获取相机的视线方向光线,然后只计算交叉点.我计算交叉点的函数不作为布尔值返回,它作为3D矢量返回(交集本身的坐标)
所以我想要实现的是计算拾取雷,但是当它没有锁定到屏幕时根据鼠标.
示例 - 所以在这里你可以看到紫色的盒子在十字准线上,但是如果我要解锁鼠标并移动它(在屏幕顶部,正常情况下)并将其移动到绿色X标记的中心我'我画了,然后我想计算从摄像机中心到屏幕顶部鼠标坐标的光线.
这应该只是一个数学问题.这里只是我目前用来计算雷的一些简短列表(并试图计算第二条射线)
鼠标X和Y原点(0x0)位于窗口/框架的左下角.
Vector3D position = new Vector3D(
camera.x,
camera.y,
camera.z);
Vector3D direction = new Vector3D(
Math.cos(Math.toRadians(camera.pitch)) * -Math.sin(Math.toRadians(-camera.yaw)) * camera.far,
Math.cos(Math.toRadians(camera.pitch)) * cameara.far,
Math.cos(Math.toRadians(camera.pitch)) * -Math.sin(Math.toRadians(-camera.yaw)) * camera.far);
direction.normalize();
Ray3D ray = new Ray(position, direction);
Run Code Online (Sandbox Code Playgroud)
这就是我计算主要拾取光线本身的方式(锁定鼠标的拾取光线).我做出了自己的类,但他们应该感(Vector3D,Ray3D,等)和normalize()方法不正是它说,标准化的载体.
因此,当我尝试使用鼠标坐标进行计算时,我在调用之前插入了以下代码direction.normalize();,因此在创建之后 …
是否可以创建一个GLSL着色器来让任何对象被发光效果包围?假设我有一个3d立方体,如果它被选中,立方体应该被蓝色发光效果包围.任何提示?
我有一个偏序集,说A = [x1, x2, ...],这意味着每一个xi和xj集合中的,(恰好)的四种可能性之一为真:xi < xj,xi == xj,xi > xj,或xi与xj所无法比拟的.
我想找到的最大元素(即,这些元素xi是针对那些还没有元素xj用xi < xj).什么是有效的算法(最小化比较次数)?我尝试构建DAG并进行拓扑排序,但只是构建图形需要进行O(n ^ 2)次比较,这太多了.
我在Python中这样做,但如果你不知道它我可以读其他语言,或伪代码.