编译一个使用OpenGL和Visual C++的文件,当我尝试包含gl.h头文件时,我得到大约150个无用的编译错误:
错误C2144:语法错误:'void'前面应加';'
错误C4430:缺少类型说明符 - 假定为int.注意:C++不支持default-int
错误C2146:语法错误:缺少';' 在标识符'glAccum'之前
等等
所以,臭名昭着的错误又回来了.该项目抱怨它无法找到main()方法(这就是错误的意思,对吧).
但是我确实有一个main,我的项目是一个Console项目,应该是.它以前工作过,所以我知道不是那样的.
此外,该项目有太多的类和文件供我发布,所以我会按要求发布您需要的任何类.
它是Visual Studio 2010上的C++,OpenGL和SDL游戏.它不是任何库的问题,因为它突然之前工作正常并且莫名其妙地显示了这个链接器错误.
编辑:main()方法:
int main(int argc, char **argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH | GLUT_ALPHA);
glutCreateWindow("Game");
glEnable(GL_DEPTH_TEST);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
g = Game();
glutInitWindowSize(g.getScreenWidth(), g.getScreenHeight());
//glutPositionWindow(1280, 50);
// Callbacks
glutDisplayFunc(handleRedraw);
glutReshapeFunc(handleResize);
glutMouseFunc(handleMouseClicks);
glutPassiveMotionFunc(handleMouseOvers);
glutKeyboardFunc(handleKeyboardEvents);
glutTimerFunc(50, moveItemToInventory, 0);
glutMainLoop();
return 0;
}
Run Code Online (Sandbox Code Playgroud) 像OpenGL这样的库访问显卡并可以生成图形程序,这些库如何访问显卡,因为它们是用C实现的.根据我所听到的,C和C++不提供用语言构建的图形功能和制作图形需要库.那么这些库是如何用C语言编写的?同样的问题也适用于声音吗?
C/C++语言的附加功能,如图形,声音,Internet访问是用低级语言编写的,然后使用库提供给C/C++?
我会感谢任何纠正我的概念或网上或书籍上的任何建议读物的摘要.
我意识到这可能是一个荒谬的问题,但在尝试找出哪些库用于哪些项目之前,我认为首先真正理解这些库的目的是有意义的.
很多视频游戏都使用像OpenGL这样的库.我在这些库中看到的所有教程都演示了如何编写告诉计算机绘制内容的代码.事实上,在游戏中,所有东西都是使用Zbrush,Maya或3ds Max等软件建模的.这些模型有纹理,很好用.看起来你需要做的就是编写一个动画循环来反复绘制模型和更新,而不是实际编写代码来绘制每一个小东西.这将非常耗时并且会使模型无用.那么OpenGL或Direct 3D在哪些方面与视频游戏和3D艺术相关?当所有图形都已创建并且只需要加载和绘制时,它们对于它们至关重要?它们主要用于着色器和效果吗?
这个问题可能只是证明我对此有多新,但这是我从未听过的问题.我刚刚开始学习编程,并且我对代码和逻辑的理解相当不错,但我根本不了解图形库或某些框架,而且教程没有帮助.
我试图理解在OpenGL中创建空间:
对象空间
世界空间
相机空间
投影空间
我对这些阶段的理解是否正确?
"立方体"正在笛卡尔坐标系的中心创建,通过键入顶点坐标直接在程序内部创建.
坐标转换为"世界"内的坐标,这意味着将其移动到屏幕上的任何位置.
嗯,实际上我希望你检查我对这两个术语的理解.
现在,我在黑屏上创建一个三角形.openGL代码如何适应这些空间?
GL_MODELVIEW默认情况下它适用于旗帜,但那是第二阶段 - 世界空间.这是否意味着调用glVertex3f()在对象空间中创建一个三角形?
世界空间在哪里?
另外,我已经读过最后两个空格不是openGL管道的一部分(或者不管它叫什么).但是,OpenGL包含标志GL_PROJECTION,例如:
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, w, h); // w - width, h - height
gluPerspective(45, ratio, 1, 100); // radio = w/h
glMatrixMode(GL_MODELVIEW);
Run Code Online (Sandbox Code Playgroud)
这段代码有什么作用?它设定了视角.它是否创建了z轴?但它不是已经是对象空间的一部分吗?
我正在尝试使用几何着色器将点膨胀成四边形以进行一些简单的2D渲染.大多数帧的渲染完全符合我的预期,但每隔一段时间渲染一些顶点都会使其属性不正确.我花了一些时间从一个包含许多移动部件的更大程序中简化这个,所以我在渲染过程中做了最低限度,但不幸的是仍然有很多设置.完整的代码在这里:
#!/usr/bin/env python
# Copyright 2011-2013, Andrew Wilson
# Licensed under the MIT license:
# http://www.opensource.org/licenses/MIT
# memglitch.py
from OpenGL import GL
import sys
import pygame
import pygame.image
import pygame.key
import pygame as PG
import numpy
import hashlib
import collections
import ctypes
######## SHADERS ########
vertex_shader = '''\
#version 330
uniform vec2 screen_dimensions;
uniform vec2 cam_position;
uniform float zoom;
layout(location=0) in vec2 position;
layout(location=1) in vec2 size;
layout(location=2) in vec2 other;
out VertexData
{
vec2 position;
vec2 size;
float …Run Code Online (Sandbox Code Playgroud) 题
如果我在Windows上使用clozure cl制作普通lisp(使用:lispbuilder-sdl,quicklisp,cffi)的2D游戏,我能否轻松将其移植到其他平台(linux/iPhone(也许)/ android)以后?lisp"适合"可安装的程序吗?
信息
推理
我真的,真的厌倦了C++.想要尝试更简单的语法+更强大的功能(不是python).记住一个游戏项目,想知道如果我突然决定稍后分发/移植游戏,是否为游戏选择lisp意味着严重的麻烦.
- 编辑 -
附加信息
"适当的"和"可安装的程序"是什么意思?
如果我尝试将可以在我的机器上运行的已完成程序转换为可安装程序包(例如,Windows上的Windows安装程序),我不确定CFFI/quicklisp将如何运行.例如,quicklisp在用户的主目录中设置路径/存储库(这可能是不可接受的行为)并尝试从外部源自动下载包,这在您尝试分发程序并确保其工作时不是一件好事意.CFFI在某些方面"绑定"外部库到lisp函数,并且我不清楚它是如何工作的,比如,如果我转储程序映像,将其嵌入到exe并在另一台机器上运行所述exe.根据常识,它应该可以正常工作,但在最坏的情况下,它可能导致我必须编写特定于lisp分发的复杂安装程序.
我正在寻找一种用颜色"填充"三维几何体的方法,并且很可能在以后的某个时间使用纹理.
假设您可以将头部物理地移动到混凝土墙中,从逻辑上讲,您只能看到黑暗.但是,在OpenGL中,当您执行此操作时,由于剔除以及绘制几何图形的方式,世界自然是空心透明的.我想在其中模拟黑暗/颜色/纹理.
我知道有些游戏通过在hud上直接覆盖纹理/颜色来做到这一点 - 因此让玩家眼花缭乱.
有没有另外一种方法可以做到这一点?假设玩家站在水中一半; 他们可以部分地看到海浪下面.如何填写它以防止他们能够清楚地看到现在屏幕的一半?
甚至这个概念叫什么?
我一直在网上寻找这个.我想知道是否有任何Node.js包/ bindigs /库允许你创建一个在没有node-webkit(NW.js)/ Electron或基于浏览器的其他实现的情况下在屏幕上绘制的应用程序.也许某些东西与opengl结合,支持2D图形?
如果您知道某些名称或链接,请告诉我.如果不是,我可能不得不自己写点东西.
感谢你们.
我在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 ×10
graphics ×4
c++ ×2
c++11 ×1
common-lisp ×1
direct3d ×1
directx ×1
javascript ×1
lnk2019 ×1
node.js ×1
portability ×1
sdl ×1
visual-c++ ×1