Прохождение границы = 1 к Glteximage2D заставляет Glteximage2d поднять gl_invalid_valueC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Прохождение границы = 1 к Glteximage2D заставляет Glteximage2d поднять gl_invalid_value

Сообщение Anonymous »

Я использую OpenGL 1.1 Glteximage2d для загрузки жесткодированного массива значений интенсивности (который представляет изображение буквы) в текстуру. />
  • Я не знаю, как сделать это по -другому < /li>
    Он должен быть в состоянии работать на любом компьютере Windows (без установки библиотеки, такой как GLFW). < /li>
    < /ul>
    , к сожалению, с помощью API win32, мой пример кода очень долго. DisplayErrors < /code> нужно проверить. < /P>

    Код: Выделить всё

    DisplayErrors
    выводит все флаги ошибок, которые установлены, и возвращает true, если есть хотя бы одна ошибка, и в противном случае.
  • Код: Выделить всё

    LoadTextureImage
    пытается загрузить массив значений пикселей в текстуру, вызывая glteximage2d и вызывает Displayerrors несколько раз для проверки любых ошибок.
  • Код: Выделить всё

    wWinMain
    используется для создания окна, инициализации контекста рендеринга OpenGL, ресурсов очистки в конце программы и вызовов LoadTextureImage для определения изображения текстуры.

Код: Выделить всё

#include 
#include 
#include   //system
#include    //printf, puts

bool DisplayErrors(){
bool ErrorOccured = false;
while (true){
switch(glGetError()){
#define OTGCASE(C) case C: puts("ERROR: "#C); ErrorOccured = true; break;
case GL_NO_ERROR: return ErrorOccured;
OTGCASE(GL_INVALID_ENUM)
OTGCASE(GL_INVALID_VALUE)
OTGCASE(GL_INVALID_OPERATION)
OTGCASE(GL_STACK_OVERFLOW)
OTGCASE(GL_STACK_UNDERFLOW)
OTGCASE(GL_OUT_OF_MEMORY)
default: puts("ERROR: Unknown"); ErrorOccured = true; break;
#undef OTGCASE
}
}
}

void LoadTextureImage(){
GLuint TextureName;
const GLfloat BorderColor[] = {0, 0, 0, 1};

//replacing the following line with `const GLint Border = 0;` allows the code
//to run successfully to produce the expected output
const GLint Border = 1;

const GLsizei Width  =  8 + 2 * Border;
const GLsizei Height = 16 + 2 * Border;
GLubyte Letter[] = {
0,  10, 100, 100, 100, 100,  10,   0,
0,  10, 100, 200, 200, 100,  10,   0,
0,  10, 100, 200, 200, 100,  10,   0,
0,  10, 100, 200, 200, 100,  10,   0,
0,  10, 100, 200, 200, 100,  10,   0,
0,  10, 100, 200, 200, 100,  10,   0,
0,  10, 100, 200, 200, 100,  10,   0,
0,  10, 100, 200, 200, 100,  10,   0,
0,  10, 100, 200, 200, 100,  10,   0,
10,  10, 100, 200, 200, 100,  10,  10,
100, 100, 100, 200, 200, 100, 100, 100,
200, 200, 200, 200, 200, 200, 200, 200,
200, 200, 200, 200, 200, 200, 200, 200,
200, 200, 200, 200, 200, 200, 200, 200,
200, 200, 200, 200, 200, 200, 200, 200,
100, 100, 100, 100, 100, 100, 100, 100,
};

glGenTextures(1, &TextureName);
if (DisplayErrors()){
puts("Failed To Generate Texture Name\n");
return;
}

glBindTexture(GL_TEXTURE_2D, TextureName);
if (DisplayErrors()){
puts("Failed To Bind Texture\n");
return;
}

glTexImage2D(
GL_TEXTURE_2D,
0,
GL_LUMINANCE8,
Width,
Height,
Border,
GL_LUMINANCE,
GL_UNSIGNED_BYTE,
Letter
);
if (DisplayErrors()){
puts("Failed To Define Texture Image\n");
return;
}

puts("Successfully Defined Texure Image");
}

int wWinMain(HINSTANCE Instance, HINSTANCE, PWSTR, int CmdShow){
HWND Window;
HDC DeviceContext;
HGLRC RenderingContext;
WNDCLASSW WindowClass = {0};

//Register Window Class
WindowClass.lpfnWndProc = DefWindowProcW;
WindowClass.hInstance = Instance;
WindowClass.lpszClassName = L"OTG";
{
ATOM WindowClassAtom;
WindowClassAtom = RegisterClassW(&WindowClass);
if (!WindowClassAtom){
printf("Failed To Register Class %lu", GetLastError());
return -1;
}
SetLastError(NO_ERROR);
}

//Create Window
Window = CreateWindowExW(
0,
WindowClass.lpszClassName,
L"firstwindow",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
Instance,
NULL
);
if (!Window){
printf("Failed To Create Window %lu", GetLastError());
goto unregisterclass;
}
SetLastError(NO_ERROR);

ShowWindow(Window,  CmdShow);

//Get Device Context
DeviceContext = GetDC(Window);
if (!DeviceContext){
printf("Failed To Retrieve Device Context %lu", GetLastError());
goto destroywindow;
}
SetLastError(NO_ERROR);

{
//Find A Suitable Pixel Format, Manually
PIXELFORMATDESCRIPTOR PixelFormatDescriptor = {0};
int PixelFormat;
PixelFormat = 1;
for (;;++PixelFormat){
int NumPixelFormats;
printf("Checking Pixel Format %d\n", PixelFormat);
NumPixelFormats = DescribePixelFormat(
DeviceContext,
PixelFormat,
sizeof(PixelFormatDescriptor),
&PixelFormatDescriptor
);
if (!NumPixelFormats){
printf("Failed To Describe PixelFormat %lu", GetLastError());
goto releasedevicecontext;
}
SetLastError(NO_ERROR);
if (
PixelFormatDescriptor.dwFlags & PFD_SUPPORT_OPENGL
&& PixelFormatDescriptor.dwFlags & PFD_DOUBLEBUFFER
&& PixelFormatDescriptor.cDepthBits >  1
)
break;
if (PixelFormat == NumPixelFormats){
puts("All Formats Checked - Cannot Find A Suitable OpenGL Pixel Format");
goto releasedevicecontext;
}
}
puts("Format Is Suitable");

//Set Pixel Format
if (!SetPixelFormat(DeviceContext, PixelFormat, &PixelFormatDescriptor)){
printf("Failed To Set Pixel Format %lu", GetLastError());
goto releasedevicecontext;
}
SetLastError(NO_ERROR);
}

//Create OpenGl Rendering Context
RenderingContext = wglCreateContext(DeviceContext);
if (!RenderingContext){
printf("Failed To Create OpenGL Rendering Context %lu", GetLastError());
goto releasedevicecontext;
}
SetLastError(NO_ERROR);

//Make OpenGl Rendering Context Current
if (!wglMakeCurrent(DeviceContext, RenderingContext)){
printf("Failed To Make OpenGL Rending Context Current %lu", GetLastError());
goto deleterenderingcontext;
}
puts("Initialized OpenGL Rendering Context");

LoadTextureImage();

//Make OpenGl Rendering Context Not Current
if(!wglMakeCurrent(NULL, NULL))
printf("\nFailed To Make OpenGL Rendering Context Not Current %lu", GetLastError());

deleterenderingcontext:
SetLastError(NO_ERROR);
if (!wglDeleteContext(RenderingContext))
printf("\nFailed To Delete OpenGL Rendering Context %lu", GetLastError());

releasedevicecontext:
SetLastError(NO_ERROR);
if (!ReleaseDC(Window, DeviceContext))
printf("\nFailed To Release Device Context %lu", GetLastError());

destroywindow:
SetLastError(NO_ERROR);
if (!DestroyWindow(Window))
printf("\nFailed To Destroy Window %lu", GetLastError());

unregisterclass:
SetLastError(NO_ERROR);
if (!UnregisterClassW(WindowClass.lpszClassName, Instance))
printf("\nFailed To Unregister Class %lu", GetLastError());
return 0;
}
< /code>
Ожидаемый результат, который я желаю, который указывает, что изображение текстуры определяется успешно, это: < /p>
Checking Pixel Format 1
Checking Pixel Format 2
Checking Pixel Format 3
Checking Pixel Format 4
Checking Pixel Format 5
Format Is Suitable
Initialized OpenGL Rendering Context
Successfully Defined Texure Image
< /code>
Однако вывод, который я получаю от выполнения моего кода, который указывает, что я не смог определить изображение текстуры: < /p>
Checking Pixel Format 1
Checking Pixel Format 2
Checking Pixel Format 3
Checking Pixel Format 4
Checking Pixel Format 5
Format Is Suitable
Initialized OpenGL Rendering Context
ERROR: GL_INVALID_VALUE
Failed To Define Texture Image
локальная переменная граница в loadtextureImage передается в параметр границы в вызове glteximage2d и используется для расчета ширины и высоты , передаваемого в Glteximage2d . Border в загрузке текста, как Const Glint Border = 1; . Если я заменяю это определение на альтернативное определение const grint border = 0; , я получаю ожидаемый выход.
Я был бы очень благодарен, если кто -то может объяснить, почему призыв к Glteximage2d в моем примере не удастся с GL_INVALID_VALUE , когда погранично подходит к 1. Пограничный Параметр теперь должен всегда быть нулевым, но я запутался, почему этот код не работает в OpenGL 1.1

Подробнее здесь: https://stackoverflow.com/questions/796 ... alid-value
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Прохождение границы = 1 к Glteximage2D заставляет Glteximage2d поднять gl_invalid_value
    Anonymous » » в форуме C++
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Прохождение границы = 1 к Glteximage2D заставляет Glteximage2d поднять gl_invalid_value
    Anonymous » » в форуме C++
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Как в cpp исправить ошибку «использование удаленной функции Ort::Value::Value(const Ort::Value&)»
    Anonymous » » в форуме C++
    0 Ответы
    78 Просмотры
    Последнее сообщение Anonymous
  • Поднять JSONDecodeError("Ожидаемое значение", s, err.value) из None Python
    Anonymous » » в форуме Python
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Поднять ValueError("Невозможно преобразовать {0!r} в Excel".format(value))
    Anonymous » » в форуме Python
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»