我的 OpenGL ES 应用程序无法运行。我使用 SDL 进行窗口管理,它保存上下文。环顾四周后,我注意到顶点着色器和片段着色器在调试器上显示为 0。连程序都是0。这会是一个原因吗?我按照着色器编译代码并将代码链接到之前制作的模板。
如果是的话,有什么问题吗?这是代码:
GLuint ShaderHelper::compileShader(GLenum type, std::string fileName) {
std::string fileContents;
std::ifstream fin;
std::string path;
// Getting the necessary path...
// These are abstractions for getting file contents
// from the main bundle.
if (type == GL_VERTEX_SHADER) {
FileOpener opener;
path = opener.retriveFileFromBundle(fileName, "vsh");
} else if (type == GL_FRAGMENT_SHADER) {
FileOpener opener;
path = opener.retriveFileFromBundle(fileName, "fsh");
} else {
std::cout << "ERROR: Invalid shader type at filename " << fileName << std::endl;
exit(1);
} …Run Code Online (Sandbox Code Playgroud) 我想使用 C 和 SDL 创建一个游戏,并且想在堆上分配游戏窗口。我是否需要使用malloc()and then分配它,或者当我调用andfree()时,SDL 会自动执行分配吗?渲染器也一样吗?SDL_CreateWindowSDL_DestroyWindow
我正在尝试编写一个自定义TGraphicControl后代,允许用户在VCL表单上嵌入SDL渲染表面.这将提供一种在表单中显示SDL动画的简单方法.
显然,使用Paint方法重绘了TGraphicControl.这种情况多久被召唤一次?只有当某些事情发生在使控件无效时,或者还有其他事情可以调用它吗?它如何与自己绘图的东西相互作用?
我正在按照lazyfoo http://lazyfoo.net/tutorials/SDL/01_hello_SDL/index2.php的教程进行操作, 并在绘制到屏幕时使用'曲面'.它是什么,它与SDL_Texture类似?它与缓冲区有关吗?
考虑以下C++函数:
SDL_Surface* loadBMP(std::string path, SDL_Surface* loadedBMP){
//Load bitmap
SDL_Surface* loadedBMP = SDL_LoadBMP(path);
if (loadedBMP == NULL){
printf("Unable to load image %s! SDL Error: %s\n", path.c_str(), SDL_GetError());
}
return loadedBMP;
//Magic
SDL_FreeSurface(loadedBMP);
}
Run Code Online (Sandbox Code Playgroud)
现在,为了这个问题,假设这loadedBMP是一个先前声明的全局变量.
这是我的问题:有没有办法让函数在return语句后继续运行?在这个功能而言,是有办法有最后的线,SDL_FreeSurface(loadedBMP)之后运行return荷兰国际集团loadedBMP?
我没有错误,控制台窗口立即关闭,而不显示我的bmp和png文件.此外,所有DLL文件和图片都在正确的文件夹中(图片在我的Debug文件夹中,exe所在的位置)我正在使用visual studio 2013
#include "stdafx.h"
#include <iostream>
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_mixer.h>
int main(int argc, char *argv[])
{
bool quit = false;
SDL_Init(SDL_INIT_VIDEO);
SDL_Window* window = NULL;
window = SDL_CreateWindow("My First RPG", 100, 100, 600, 400, SDL_WINDOW_SHOWN);
if (window == NULL)
{
std::cout << "Window couldn't be opened" << std::endl;
return 0;
}
return 0;
SDL_Renderer* renderer = NULL;
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
SDL_Event* mainEvent = new SDL_Event();
SDL_Texture* background_image = NULL;
background_image = IMG_LoadTexture(renderer, "background.bmp");
if (background_image …Run Code Online (Sandbox Code Playgroud) 我实际上学习了一些OpenGL,我设法加载网格并在窗口中显示它.然后我用SDL做了一个函数,让我用箭头键旋转网格.但是当我潜入Shaders时我做了一些改变,但我不能为3D模型进行简单的旋转.
这是我的绘图功能:
glMatrixMode(GL_MODELVIEW); //set the matrix to model view mode
glPushMatrix(); // push the matrix
glRotatef(1.0,0.0,0.0,1.0); //apply transformation
//Primer buffer, modelo
glBindBuffer(GL_ARRAY_BUFFER, _vboID);
glEnableVertexAttribArray(0);
glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0,vertices.size());
glDisableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glPopMatrix();//pop the matrix
glMatrixMode(GL_PROJECTION); // Apply projection matrix again
Run Code Online (Sandbox Code Playgroud)
Theese是我的着色器:
片段着色器(仅用于给出颜色)
#version 130
out vec3 color;
void main()
{
color = vec3(0.0,0.5,1.0);
}
Run Code Online (Sandbox Code Playgroud)
顶点着色器(用它来乱搞并尝试):
#version 130
in vec3 vertexPosition;
void main()
{
gl_Position.x = vertexPosition.x;
gl_Position.y = vertexPosition.y-1.0;
gl_Position.z = vertexPosition.z;
gl_Position.w = 1.0; …Run Code Online (Sandbox Code Playgroud) 我正在尝试从 Uint8* 制作 Uint8 向量,但由于某些原因某些值不相同。这是我的代码。
std::vector<Uint8> wav_vector = {};
Uint8* wav_buffer_;
for (unsigned int i = 0; i < wav_length_; i++) {
wav_vector.push_back(wav_buffer_[i]);
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试验证这些值:
for (unsigned int i = 0; i < wav_length_; i++){
if (wav_buffer_[i]!=wav_vector[i]){
cout<<i<<endl;
printf("Orignal Buffer %u\n", wav_buffer_[i]);
printf("Vector Buffer %u\n", wav_vector[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
这些是我的示例输出:
Index: 0
Orignal Buffer 208
Vector Buffer 40
Index: 1
Orignal Buffer 72
Vector Buffer 3
Index: 2
Orignal Buffer 111
Vector Buffer 183
Index: 3
Orignal Buffer 1
Vector Buffer …Run Code Online (Sandbox Code Playgroud) 以下链接表示中定义的结构main没有函数调用的范围,因为它们是本地的,因此您应该全局定义结构。但是对于变量,最好在本地声明变量并通过指针传递给函数,而不是声明全局变量。
在纯 C 中有没有办法使用指针等将 main 中定义的结构传递给函数?如果您不介意,请使用示例程序来演示该方法。谢谢。
在哪里声明结构,在 main() 内部还是在 main() 外部?
这段代码有效,但不是我想要的。我想在main. 这可能吗?
#include <stdio.h>
#include <SDL2/SDL.h>
void function();
struct hexColour
{
Uint32 red;
}hc;
int main(void)
{
hc.red = 0xFFFF0000;
function(hc);
return 0;
}
void function(struct hexColour hc)
{
printf("red is %x\n", hc.red);
}
Run Code Online (Sandbox Code Playgroud)
我想要的是:
int main(void)
{
struct hexColour
{
Uint32 red;
}hc;
hc.red = 0xFFFF0000;
function(hc);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试添加成员函数的定义,game.h但出现编译器错误,指出 void 函数是先前定义的。game.h和 也输出相同的错误game.cpp。这几乎就像pragma once不起作用?我在 Rider 中遇到错误,也在game.cpp文件中说了同样的事情,但仅限于 void 函数。
游戏.h
\n#pragma once\n\n#include "SDL2/SDL.h"\n\n\nclass Game{\npublic:\n\n Game() {}\n ~Game() {}\n\n bool init(const char* title, int xPos, int yPos, int width,int height, int flags);\n\n\n\n void render(){};\n void update(){};\n void handleEvents(){};\n void clean(){};\n\n\n bool running() {return m_bRunning;}\n\nprivate:\n\n SDL_Window* m_pWindow;\n SDL_Renderer* m_pRenderer;\n\n bool m_bRunning{};\n};\nRun Code Online (Sandbox Code Playgroud)\n游戏.cpp
\n#include <iostream>\n#include "game.h"\n\n\nbool Game::init(const char* title, int xPos, int yPos, int width, int height, int flags){\n\n …Run Code Online (Sandbox Code Playgroud)