我正在学习OpenGL并尝试运行我的第一个程序.我已将所有文件包含在include,lib和bin文件夹中.我试图添加opengl32.lib; glut32.lib; glu32.lib; 在配置属性 - >链接器 - >输入,但它也没有工作.
我正在使用Visual Studio 2012.
///////////////////////////////////////////////////////////////////////
//
// triangles.cpp
//
///////////////////////////////////////////////////////////////////////
#include <iostream>
using namespace std;
#include <vgl.h>
#include <LoadShaders.h>
enum VAO_IDs { Triangles, NumVAOs };
enum Buffer_IDs { ArrayBuffer, NumBuffers };
enum Attrib_IDs { vPosition = 0 };
GLuint VAOs[NumVAOs];
GLuint Buffers[NumBuffers];
const GLuint NumVertices = 6;
//---------------------------------------------------------------------
//
// init
//
void
init(void)
{
glGenVertexArrays(NumVAOs, VAOs);
glBindVertexArray(VAOs[Triangles]);
GLfloat vertices[NumVertices][2] = {
{ -0.90, -0.90 }, // Triangle 1
{ 0.85, -0.90 }, …Run Code Online (Sandbox Code Playgroud) 我是3D游戏编程的新手,现在正在Windows上研究DirectX和OpenGL.但我想出了一个地形编辑器,但我无法在网上获得任何开放的教程或想法.
有没有一个很好的教程或开源代码来学习这个?
简单的一个很好,我只是想知道如何提升或降低地形,或在地图上放一棵树,如下面的视频.
我正在努力编译一些开源库,然后我遇到了这个:
GLfloat campos[3] = {0.0 + modelview[2], 0.0 + modelview[6], 0.0 + modelview[10]};
Run Code Online (Sandbox Code Playgroud)
这在CentOS上编译很好,使用gcc,我真的期望它.
但是,在Mac上,使用带有llvm的XCode,它将无法编译,我不得不将其更改为:
GLfloat campos[3] = static_cast<GLfloat>(0.0 + modelview[2]), static_cast<GLfloat>(0.0 + modelview[6]), static_cast<GLfloat>(0.0 + modelview[10]);
Run Code Online (Sandbox Code Playgroud)
然后它奏效了.作为参考,modelview是另一个GLFloat,如下所示:
GLfloat modelview[16];
Run Code Online (Sandbox Code Playgroud)
由于modelview是一个GLFloat,static_cast正在应用于带有GLfloat的float总和的结果,但我确实希望免费得到它.
为什么行为不同?
我安装了GLFW 3(包括将文件夹包含到VS\C\include,lib到VS\C\lib和dll到SySWOW54).现在,当我尝试从文档中编译第一个示例时
#include <GLFW/glfw3.h>
#include <stdlib.h>
#include <stdio.h>
static void error_callback(int error, const char* description)
{
fputs(description, stderr);
}
static void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
glfwSetWindowShouldClose(window, GL_TRUE);
}
int main(void)
{
GLFWwindow* window;
glfwSetErrorCallback(error_callback);
if (!glfwInit())
exit(EXIT_FAILURE);
window = glfwCreateWindow(640, 480, "Simple example", NULL, NULL);
if (!window)
{
glfwTerminate();
exit(EXIT_FAILURE);
}
glfwMakeContextCurrent(window);
glfwSetKeyCallback(window, key_callback);
while (!glfwWindowShouldClose(window))
{
float ratio;
int width, height;
glfwGetFramebufferSize(window, &width, &height); …Run Code Online (Sandbox Code Playgroud) 我正在用C语言编写一个OpenGL程序,它实现了alpha透明的Bill Boarding粒子,它通过pnglib使用PNG(透明度)作为纹理.但是,我发现粒子的透明区域仍然会替换它前面的粒子.换句话说,新调用的粒子虽然在某些区域是透明的,但是完全重叠在它们之前调用的一些粒子,相反,那些先前称为粒子的粒子应该透过透明度来显示.
为了可视化它所具有的效果,我附上一些图像来显示问题:
最初我称这些粒子从最老到最新: 
但是,当视图更改时,重叠效果显而易见: 
当我决定撤销通话顺序时,我得出相反的结论:

我认为解决这个问题的方法是将粒子从最远离相机调到最近.然而,遍历每个活动粒子,从最远到最近的顺序排序,然后每个显示帧调用每个粒子,计算量很大.我希望找到一个更简单,更有效的解决方案.我已经试过了,glBlendFunc()但没有sfactor或dfactor似乎工作.
我发现很难将.obj文件转换为openGL.我找到了我的模型,在这里我附上了main.cpp文件供您参考.我不确定如何运行文件.当我在openGL中调用所有这些文件时,我应该运行哪个文件.最初,当我在Visual Studio中打开OpenGL时,我调用了main.cpp文件并运行该文件.但它显示了许多错误.错误说无法找到PDB文件.那是什么?
int main(int argc, const char* argv[])
{
glutInit(&argc, const_cast<char**>(argv));
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100, 100);
glutInitWindowSize(640, 480);
glutCreateWindow("Sample Window");
glutDisplayFunc(render);
glutMainLoop();
return 0;
}
void keyboard(unsigned char c, int x, int y){
std::cout << "Called Keyboard";
if(c == 'a'){
exit(0);
}
}
void mouse(int button, int state, int x, int y){
std::cout << "Called Mouse";
if(button == GLUT_RIGHT_BUTTON){
exit(0);
}
}
void render(){
}
Run Code Online (Sandbox Code Playgroud)
所以,我对上面的代码有疑问.键盘和鼠标功能不会被调用.
我希望你能设法重现这个问题.
正如这里所说,OpenCV 使用 IPP,而 IPP 使用 GPU:
\n\n\n\n\n原来 OpenCV 正在使用 IPP,而 IPP 本身现在也可以使用 GPU\n。
\n\n以防万一其他人在 google 上搜索“opencv gpu 速度较慢”并且不知道\n IPP GPU 支持;)
\n
另外,我发现了这个:
\n\n\n\n\n使用Intel\xc2\xae IPP异步优化增强现实管道
\n\n使用 Intel\xc2\xae GPU优化 Total Immersion 的 D\'Fusion* 增强现实管道的性能和功耗
\n
而且没有一个关键字:OpenCL、OpenACC、CUDA、nVidia,...
\n\n与GPU相关的关键字只有一个:OpenGL
\n\n这是否意味着Intel IPP仅支持Intel GPU?或者 Intel IPP 支持任何支持 OpenGL 的 GPU(nVidia GeForce、AMD Radeon)?
\n我画了一个盒子。我添加了处理 vao 和 vbo 的基本类。
class BasicObject_V2
{
public:
BasicObject_V2(GLuint typeOfPrimitives = 0){
this->typeOfPrimitives = typeOfPrimitives;
switch (this->typeOfPrimitives){
case GL_QUADS: numVertsPerPrimitive = 4; break;
}}
void allocateMemory(){
glGenVertexArrays(1, &vaoID);
glBindVertexArray(vaoID);
glGenBuffers(1, &vboID);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(vertexAttributes), &vertices[0], GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 48, (const void*)0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 48, (const void*)12);
glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, 48, (const void*)24);
glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, 48, (const void*)40);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glEnableVertexAttribArray(3);
}
GLuint vboID;
GLuint vaoID;
GLuint typeOfPrimitives;
GLuint …Run Code Online (Sandbox Code Playgroud) 我想涉足 OpenGL 项目中的一些程序纹理,但似乎没有任何效果。我所需要的只是将 RGB 和可能的 A 值输入到空纹理中,而不是从文件加载它。在实际的代码中我该如何做到这一点?
编辑:还没有主要代码,因为我没有发现任何有用的东西。目前最好的猜测是这样的:
void GenerateTexture()
{
unsigned char image_data[16] = {0, 0, 150, 255, 125, 0, 0, 255, 0, 0, 150, 255, 125, 0, 0, 255};
glGenTextures(1, &tex_obj);
glBindTexture(GL_TEXTURE_2D, tex_obj);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 2, 2, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data);
}
Run Code Online (Sandbox Code Playgroud)
...像这样实现:
glBegin (GL_QUADS);
if (*irrelevant for question*){
glTexCoord2f(0.0,1.0);
glVertex3f (-0.45-cam.pos.val[0], 0.45-cam.pos.val[1], 0.45-cam.pos.val[2]);
glTexCoord2f(0.0,0.0);
glVertex3f (-0.45-cam.pos.val[0], -0.45-cam.pos.val[1], 0.45-cam.pos.val[2]);
glTexCoord2f(1.0,0.0);
glVertex3f (0.45-cam.pos.val[0], -0.45-cam.pos.val[1], 0.45-cam.pos.val[2]);
glTexCoord2f(1.0,1.0);
glVertex3f (0.45-cam.pos.val[0], 0.45-cam.pos.val[1], 0.45-cam.pos.val[2]);
}
glEnd ();
Run Code Online (Sandbox Code Playgroud)
...但是一旦使用超过 1x1 的纹理运行,它就会变成干净的白色。