我的openGL视图大小为(比方说)800(宽度)x600(高度).然后我得到了一个二维对象:
0.0 , 0.0
0.1 , 0.0
0.1 , 0.1
0.0 , 0.1
Run Code Online (Sandbox Code Playgroud)
这个,正如你所理解的那样应该是一个正方形(基于类比).但是在我的openGL视图中打印出这个拉伸.现在,我理解为什么会这样.它基本上是因为我正在使用-1,1的默认矩阵.由于我800x600的分辨率没有1的宽高比,我的形状变得紧张.
现在我对如何解决这个问题更感兴趣.我已经阅读过像glFrustum,glOrtho,glViewPort这样的函数,它们正在投影矩阵上发生,可以解决这些问题.事实是,我不确定使用它们.我基本上想要的是在制作正方形时保持上述坐标,并且在我的视图上实际上是一个正方形.
什么是解决这个问题的正确方法?
所以我试图创建一个openGL视图(在我的窗口中).我正在制作一个Cocoa应用程序.我设法通过Interface Builder创建一个,但出于教育目的,我想继续创建一个没有它.就在论文上.
这就是我告诉你即时挣扎的观点.所以到目前为止我基本上已经完成了尝试:我创建了一个继承自NSOpenGLView的新类"MyOpenGLView.h/m".我没有添加私有变量或方法只是类名.我唯一做的是覆盖initWithFrame :(在其中添加一个self = [super initWithFrame:pixelFormat:].)我在Web上读到它,你必须首先用这样的东西实例化它然后才能使用它) .这是代码:
- (id) initWithFrame:(NSRect)frameRect
{
NSOpenGLPixelFormat *pixelFormat = [[NSOpenGLPixelFormat alloc]
initWithAttributes:(NSOpenGLPixelFormatAttribute[])
{
NSOpenGLPFAWindow,
NSOpenGLPFADoubleBuffer,
NSOpenGLPFADepthSize, 32,
nil
}];
self = [super initWithFrame:frameRect pixelFormat:pixelFormat];
[[self openGLContext] makeCurrentContext];
}
Run Code Online (Sandbox Code Playgroud)
所以我有另一个名为"MyViewController.h/m"的类来处理我的View?我有我的MyOpenGLView*myView.在.m文件中,我使用以下内容:
myView = [[MyOpenGLView alloc] initWithFrame:CGRectMake(0,0,100.0,100.0)];
if (!myView) { NSLog(@"ERROR"); }
Run Code Online (Sandbox Code Playgroud)
当然,我得到错误.
我的窗口应用程序中没有移植的openGL视图.我猜它有关于被调用的方法的层次结构,但后来再次..我不确定.你可以帮我吗?
所以我正在做一个塔防游戏.我与他们共享了一个构建,因此我可以检查一切是否在其他主机上执行.
而实际发生的事情是,虽然一切都完美地呈现在我的身边(在我的mac/xcode + windows/visual studio 2012上),在我朋友的一边,似乎几何图形混乱了.我的屏幕上的每个对象都由VBO表示,我每次都会使用它来渲染到不同的位置.但似乎我的VBO具有从所有模型导入的所有几何体.(因此塔边有树.)
这是结果:
(我的电脑)
(我朋友的电脑)
到目前为止,我已经设法将此问题调试到某一点.我可以告诉它不是我导入我的模型的方式,因为我在创建一个带有所有向量的debug.txt文件,然后我将它们作为VBO发送到gpu,在两台计算机上它们输出相同的值.所以我的矢量不会被内存问题或其他任何东西弄乱.所以我想也许这就是我设置或渲染我的VBO的方式
最令我印象深刻的是,为什么我的电脑上的东西不在朋友的电脑上.我知道的一个区别是我的电脑是一个开发者工作站(无论这意味着什么),而我朋友的电脑却没有.
这是我的VBO加载函数和我的VBO绘图函数:我使用glfw创建我的窗口和上下文,并包含glew标头以启用一些较新的opengl函数.
void G4::Renderer::LoadObject(
G4::TILE_TYPES aType,
std::vector<float> &v_data,
std::vector<float> &n_data,
std::vector<float> &t_data,
float scale,
bool has_texture,
unsigned int texture_id
)
{
unsigned int vertices_id, vertices_size, normals_id, texturecoordinates_id;
vertices_size = static_cast<unsigned int>(v_data.size());
glGenBuffers(1, &vertices_id);
glGenBuffers(1, &normals_id);
//::->Vertex array buffer upload.
glBindBuffer(GL_ARRAY_BUFFER, vertices_id);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*v_data.size(), &v_data.front(), GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
//::->Normal Array buffer upload.
glBindBuffer(GL_ARRAY_BUFFER, normals_id);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*n_data.size(), &n_data.front(), GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
if (has_texture)
{
glGenBuffers(1, &texturecoordinates_id);
glBindBuffer(GL_ARRAY_BUFFER, texturecoordinates_id);
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*t_data.size(), &(t_data[0]), GL_STATIC_DRAW); …Run Code Online (Sandbox Code Playgroud)